当Linux系统中出现CPU或Sys占用异常时,可能由以下原因导致:
进程级问题:
系统级问题:
硬件级问题:
# 实时监控CPU使用情况
top -H -p [PID] # 查看特定进程的线程级CPU使用
htop # 增强版top,支持颜色和鼠标操作
mpstat -P ALL 1 # 查看每个CPU核心的使用情况
vmstat 1 # 查看系统整体状态,包括上下文切换
# 系统调用分析
strace -cp [PID] # 统计进程系统调用
perf top -s comm,pid,symbol # 使用perf分析热点
# 火焰图生成(需要安装perf和FlameGraph)
perf record -F 99 -p [PID] -g -- sleep 30
perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > out.svg
# 锁竞争分析
perf lock record -p [PID] # 记录锁事件
perf lock report # 分析锁竞争
# 1. 找出高CPU进程
ps -eo pid,pcpu,pmem,comm --sort=-pcpu | head
# 2. 分析进程状态
cat /proc/[PID]/status
cat /proc/[PID]/stack # 查看线程堆栈
# 3. 使用gdb附加分析(生产环境慎用)
gdb -p [PID]
(gdb) thread apply all bt # 获取所有线程堆栈
# 调整进程优先级
renice -n 19 -p [PID] # 降低进程优先级
# 限制CPU使用(cgroups)
cgcreate -g cpu:/cpulimited
cgset -r cpu.cfs_quota_us=50000 cpulimited # 限制50% CPU
cgexec -g cpu:cpulimited [command]
# 调整内核参数(临时)
sysctl -w kernel.watchdog_thresh=30 # 调整看门狗阈值
sysctl -w kernel.sched_migration_cost_ns=5000000 # 减少迁移开销
# 安装中断平衡工具
apt-get install irqbalance
# 手动调整中断亲和性
echo 1 > /proc/irq/[IRQ]/smp_affinity # 绑定到CPU0
strace
或perf
确定频繁的系统调用sendfile
替代read/write文件传输# 查看软中断分布
cat /proc/softirqs
# 网络软中断优化
ethtool -C eth0 rx-usecs 30 # 调整网卡中断合并
ethtool -K eth0 gro off # 关闭GRO(某些场景)
perf lock
分析锁热点# 使用sar进行长期监控
apt-get install sysstat
# 在/etc/default/sysstat中启用
sed -i 's/ENABLED="false"/ENABLED="true"/' /etc/default/sysstat
service sysstat restart
# 使用Prometheus + Grafana搭建监控系统
# Node Exporter提供系统指标
# 自定义导出器监控特定应用指标
strace
和gdb
,可能导致进程挂起通过系统化的诊断和有针对性的优化,大多数CPU和Sys占用异常问题都能得到有效解决。