Linux负载高但CPU低_负载异常原因解析

5次阅读

linux负载高但cpu使用率低是正常现象,因load average统计就绪和d状态进程总数,而%cpu仅计算实际运行时间;常见原因包括磁盘i/o阻塞、内存不足引发换页、僵尸进程积、内核线程卡死及短生命周期进程洪峰。

Linux负载高但CPU低_负载异常原因解析

Linux负载高但CPU使用率低,不是系统“出bug”,而是指标含义不同导致的正常现象。关键要明白:load average统计的是就绪队列+不可中断睡眠(D状态)进程总数,而top里的%CPU只算真正运行在CPU上的时间。所以当大量进程卡在I/O、锁、硬件响应上时,它们不耗CPU,却持续推高负载。

磁盘I/O阻塞是最常见原因

进程发起读写请求后,若磁盘响应慢(如机械盘随机IO、坏块重试、NFS挂载超时、RAID降级),就会进入D状态等待,既不执行也不释放队列位置。此时wa(I/O wait)在topvmstat中会明显升高。

  • iostat -x 1观察%iowaitawait:持续超过5%或await > 100ms即需警惕
  • pidstat -w 1查看哪些进程长期处于D状态
  • 结合iotop确认具体是哪个进程/线程在刷盘(需root权限)

内存不足引发换页风暴

物理内存吃紧时,内核频繁启动kswapd0回收内存,同时大量进程因缺页中断进入等待——这本身不占CPU,但会显著拉高load,并可能连带加剧磁盘IO压力。

  • 检查vmstat 1中的si(swap in)和so(swap out):非零且持续波动说明正在换页
  • free -havailable值是否远低于total,尤其注意buff/cache是否已无法有效释放
  • dmesg -t | grep -i "out of memory|kill process"确认是否触发OOM killer

其他容易被忽略的诱因

除I/O和内存外,还有几类情况会导致load虚高:

  • 僵尸进程堆积:子进程退出但父进程未调用wait(),残留的Z+状态进程仍计入load,可用ps aux | awk '$8 ~ /Z/ {print}'筛查
  • 内核线程卡死:如kworkerkhungtaskd异常占用D状态,常伴随dmesg报错(硬件故障、驱动bug)
  • 短生命周期进程洪峰:高频fork/exit(如配置错误的监控脚本、日志轮转),top采样易漏捕,但/proc/loadavg会如实记录

排查时别只盯top,先跑uptimecat /proc/loadavg看负载趋势,再用vmstat 1横向对比r(就绪数)、b(阻塞数)、wasi/so这几项。定位到方向后,再深入查进程、IO、内核日志。逻辑理清了,这类问题其实不难解。

text=ZqhQzanResources