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、或第三方内核模块(如安全审计驱动)引发额外开销








