linux 中 cpu 负载高不等于 cpu 使用率高,需区分 load average 与 %cpu;高负载可能由 r / d 态进程增多、io 阻塞、内核锁争用或软中断堆积引起,应结合 uptime、top、sar、ps、iostat、iotop、dmesg 及 perf 等工具分层定位。

Linux 系统中 CPU 负载持续升高,不等于 CPU 使用率高,需区分load average(平均负载)和%CPU(CPU 使用率)。负载反映的是单位时间内处于 R 状态(运行中)或 D 状态(不可中断睡眠,如 IO 等待)的进程数总和。因此,高负载可能由大量可运行进程、频繁 IO 阻塞、内核锁争用或软中断堆积引起。
确认当前负载数值与趋势
执行 uptime 或cat /proc/loadavg查看 1 /5/15 分钟平均负载,并对比 CPU 核心数(nproc):若 1 分钟负载长期 > CPU 逻辑核数,说明系统已过载。
- 观察 top 右上角的 load average,同时注意 %CPU 列是否同步飙升——若负载高但 %CPU 低,大概率是 IO 或不可中断任务拖累
- 用 sar -q 1 10 持续采样,确认负载是否稳定上升、脉冲式波动,还是突发后回落,这对定位周期性任务或定时作业很关键
- 检查 /proc/stat 中procs_running和 procs_blocked 字段,实时反映 R / D 状态进程数量
定位高负载进程及其状态
用 ps aux –sort=-pcpu 看 CPU 占用高的进程,但更关键的是用ps -eo pid,ppid,stat,%cpu,time,args –sort=-pcpu | head -20,重点关注 STAT 列:
- R:正在运行或就绪——可能是计算密集型任务
- D:不可中断睡眠——常见于磁盘 IO、NFS 挂载卡顿、内核模块死锁,此时 kill 无效,需查 IO 栈
- S或I:可中断睡眠——正常等待事件,一般不直接推高 load
- 配合 pidstat -w 1 查看每秒上下文切换(cswch/s)和任务创建(proc/s),异常增高常指向频繁 fork 或线程风暴
排查 IO 与内核路径瓶颈
当 top 显示 %wa(iowait)偏高,或 procs_blocked 持续非零,说明 D 态进程堆积:
- 用 iostat -x 1 检查%util、await、r_await/w_await,确认是否设备响应慢或队列深度过大
- 用 iotop -oPa 定位具体进程的读写吞吐与 IO 等待时间
- 检查 dmesg -T | tail -30 是否有 SCSI 超时、ext4 journal hang、NVMe reset 等内核 IO 错误日志
- 对疑似 D 态进程,用 cat /proc/
/stack 获取其内核调用栈,判断卡在哪个函数(如blk_mq_wait_dispatch、nfs_wait_on_request)
检查软中断、定时器与内核线程异常
某些场景下,用户进程不多,但 top 中ksoftirqd、rcu_preempt、kworker等内核线程 CPU 占比高,且负载居高不下:
- 用 cat /proc/interrupts 查看各 CPU 上中断分布,特别关注 NET_RX、TIMER、IPI 是否严重不均衡
- 用 sar -I ALL 1 监控每类中断触发频次,突增可能对应网卡收包风暴或定时器泄漏
- 用 perf top -g -e irq:irq_handler_entry 抓取中断处理热点;或 perf record -e ‘syscalls:sys_enter_*’ -a sleep 10 分析系统调用分布
- 检查是否启用透明大页(THP)、ksm、或第三方内核模块(如安全审计驱动)引发额外开销






























