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

Linux负载高但CPU使用率低,不是系统“出bug”,而是指标含义不同导致的正常现象。关键要明白:load average统计的是就绪队列+不可中断睡眠(D状态)进程总数,而top里的%CPU只算真正运行在CPU上的时间。所以当大量进程卡在I/O、锁、硬件响应上时,它们不耗CPU,却持续推高负载。
磁盘I/O阻塞是最常见原因
进程发起读写请求后,若磁盘响应慢(如机械盘随机IO、坏块重试、NFS挂载超时、RAID降级),就会进入D状态等待,既不执行也不释放队列位置。此时wa(I/O wait)在top或vmstat中会明显升高。
- 用
iostat -x 1观察%iowait和await:持续超过5%或await > 100ms即需警惕 - 用
pidstat -w 1查看哪些进程长期处于D状态 - 结合
iotop确认具体是哪个进程/线程在刷盘(需root权限)
内存不足引发换页风暴
物理内存吃紧时,内核频繁启动kswapd0回收内存,同时大量进程因缺页中断进入等待——这本身不占CPU,但会显著拉高load,并可能连带加剧磁盘IO压力。
- 检查
vmstat 1中的si(swap in)和so(swap out):非零且持续波动说明正在换页 - 看
free -h的available值是否远低于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}'筛查 -
内核线程卡死:如
kworker、khungtaskd异常占用D状态,常伴随dmesg报错(硬件故障、驱动bug) -
短生命周期进程洪峰:高频fork/exit(如配置错误的监控脚本、日志轮转),
top采样易漏捕,但/proc/loadavg会如实记录
排查时别只盯top,先跑uptime和cat /proc/loadavg看负载趋势,再用vmstat 1横向对比r(就绪数)、b(阻塞数)、wa、si/so这几项。定位到方向后,再深入查进程、IO、内核日志。逻辑理清了,这类问题其实不难解。










