用top和htop快速定位高负载进程
服务器CPU负载飙升是最常见的运维告警之一。接到告警后,第一步是登录服务器执行top命令,观察load average三个数值和各进程CPU占用率。load average显示1分钟、5分钟、15分钟的平均负载,数值超过CPU核数即表示过载。
htop提供更直观的界面,支持鼠标操作和树状视图。按F5切换树状模式,可以清晰看到进程间的父子关系,快速判断是主进程还是子进程占用资源。按F6可选择按CPU%排序。
# 查看每个CPU核心的使用情况
mpstat -P ALL 1 5
# 按CPU占用排序显示前20个进程
ps aux --sort=-%cpu | head -20
mpstat能分别显示每个逻辑核心的利用率,区分用户态(%usr)、内核态(%sys)和I/O等待(%iowait)。如果%sys持续偏高,说明内核开销大,可能是锁竞争或频繁系统调用导致。
分析load average与CPU利用率的关系
load average反映的是系统运行队列中的平均进程数,不仅仅是CPU使用率。高load但CPU利用率低,通常意味着大量进程在等待I/O(磁盘或网络)。这种情况需要排查磁盘性能和网络延迟:
# 检查I/O等待情况
iostat -x 1 5
# 查看磁盘队列深度和await
# await: 平均I/O等待时间(ms),超过20ms需关注
# %util: 设备利用率,持续接近100%说明磁盘是瓶颈
如果是磁盘I/O瓶颈,考虑升级SSD、调整raid策略或优化应用层读写模式。网络I/O则用nethogs或iftop定位占用带宽的进程。
用perf和火焰图找到热点函数
当知道具体进程占用CPU但无法从代码层面判断瓶颈时,perf是下一步工具。对目标进程采样CPU性能计数器,生成火焰图可视化调用栈:
# 对PID为12345的进程采样30秒
sudo perf record -F 99 -p 12345 -g -- sleep 30
sudo perf script > perf.out
# 生成火焰图(需安装FlameGraph工具)
git clone https://github.com/brendangregg/FlameGraph
sudo perf script | ./FlameGraph/stackcollapse-perf.pl | ./FlameGraph/flamegraph.pl > cpu.svg
火焰图中,横轴是采样总量,纵轴是调用栈深度。最宽的色块就是CPU消耗最多的函数。对于Java应用,可使用async-profiler获取更准确的JIT编译后代码的采样数据。
排查内核态CPU占用过高
当top显示%sys占比远超%usr时,问题出在内核态。常见原因包括:
- 频繁的系统调用:应用层循环调用read/write/send等,内核频繁上下文切换
- 锁竞争:多线程程序争抢spinlock,内核在锁调度上消耗大量CPU
- 软中断风暴:网络包量突增导致软中断处理占用大量CPU
# 查看软中断分布
cat /proc/softirqs
# 查看硬中断分布
cat /proc/interrupts
# 监控上下文切换频率
vmstat 1 10
# cs列:每秒上下文切换次数,超过100万需重点关注
软中断集中在NET_RX时,说明网络收包压力大,可考虑开启RPS(Receive Packet Steering)将网络包分发到多核处理。
容器化环境中的CPU限制排查
Kubernetes中Pod设置了CPU limit后,容器进程受CFS调度器限制。当进程CPU使用达到limit时,会被throttle限流,表现为CPU被强制抑制但应用响应变慢。排查方法:
# 查看容器的CPU throttle情况
cat /sys/fs/cgroup/cpu/cpu.stat
# nr_throttled: 被限流次数
# throttled_time: 累计限流时间(ns)
# Prometheus指标
# container_cpu_cfs_throttled_periods_total
# container_cpu_cfs_throttled_seconds_total
如果throttle频繁发生,需要调高CPU limit或优化应用代码减少CPU消耗。对于Java应用,JVM的GC线程不受CPU limit约束(在cgroup v1中),可能导致实际CPU使用超过limit值。
建立常态化CPU监控体系
单次排查解决不了根本问题,需要建立持续监控体系。推荐方案:
- 指标采集:Node Exporter采集主机级指标,cAdvisor采集容器级指标
- 告警规则:load average > 核数x2持续5分钟触发P2告警,CPU利用率>90%持续10分钟触发P1
- 自动诊断:告警触发后自动执行诊断脚本,采集top、perf、iotop快照,附在告警事件中
这种自动化排查机制能将平均定位时间从30分钟缩短到5分钟以内。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/linux-fu-wu-qi-cpu-fu-zai-yi-chang-pai-cha-quan-liu-cheng/