系统负载过高但CPU占用率低,主因是磁盘I/O阻塞、内存不足引发SWAP频繁交换、高IO等待进程、CPU亲和性异常或内核D状态进程堆积,需依序用iostat、free、iotop、mpstat和ps排查。

如果您在宝塔面板中看到“系统负载过高”提示,但监控图表显示CPU占用率却很低,则说明系统中存在大量处于运行队列或等待状态的进程,而这些进程并未实际占用CPU计算时间。以下是针对该现象的多种排查与应对方法:
一、检查磁盘I/O瓶颈
高系统负载但低CPU使用率最常见的原因是磁盘I/O阻塞,大量进程因等待硬盘读写而堆积在运行队列中,导致load值飙升。此时iostat可直观反映设备响应延迟与await值是否异常升高。
1、执行命令查看实时磁盘I/O状况:
sudo iostat -x 1 5
2、观察%util列是否持续接近100%,同时关注await(平均等待毫秒数)是否超过50ms
3、若发现/dev/sda等设备%util长期饱和,进一步检查磁盘健康:
sudo smartctl -a /dev/sda
4、确认是否存在坏道或固件异常,如smartctl输出含Reallocated_Sector_Ct或Current_Pending_Sector非零值,需立即备份并更换硬盘
二、分析内存不足引发的SWAP频繁交换
当物理内存耗尽时,系统被迫将进程页频繁换入换出SWAP分区,进程虽未运行但持续处于不可中断睡眠(D状态),显著推高load值,而CPU仍空闲。
1、运行命令查看内存与SWAP实时使用:
free -h
2、检查是否有大量SWAP使用(SwapUsed列不为0且持续波动)
3、进入top界面后按Shift+M,观察哪些进程的SWAP内存占用最高
4、检查vm.swappiness值:
cat /proc/sys/vm/swappiness
5、若值大于60且存在频繁swap,建议临时设为10:echo 10 | sudo tee /proc/sys/vm/swappiness
三、定位高IO等待进程(iotop方式)
iotop能直接显示每个进程/线程的磁盘读写速率及IO等待占比,是识别I/O型负载源头最高效的工具。
1、安装iotop(Ubuntu/Debian):
sudo apt update && sudo apt install -y iotop
2、安装iotop(CentOS/AlmaLinux):
sudo yum install -y iotop
3、以root权限运行并按O键仅显示有IO活动的进程:
sudo iotop -o
4、观察“IO>”列数值最高的进程,记录其PID
5、若发现mysqld、php-fpm或某个站点的php-cgi进程IO持续超2MB/s,应立即检查其对应数据库慢查询或文件日志写入频率
四、检测进程CPU亲和性异常集中
极少数情况下,所有关键进程被错误绑定至单一CPU核心(如cpu0),造成该核队列严重积压,而其他核心空闲,系统load飙升但整体CPU利用率偏低。
1、查看各核心实时负载分布:
mpstat -P ALL 1 3
2、确认是否仅cpu0的%usr或%sys显著高于其他核心(如cpu0达95%,其余均低于5%)
3、检查任意高负载进程的CPU绑定策略:
taskset -p PID(替换为实际PID)
4、若输出形如“current affinity list: 0”,表明该进程被锁定在cpu0
5、临时解除绑定:taskset -p 0xffffffff PID(使进程可调度至全部CPU)
五、排查内核级D状态进程堆积
处于不可中断睡眠(D状态)的进程通常由底层驱动或硬件交互异常引起,无法被kill,会长期占据load计数,但不消耗CPU。
1、列出所有D状态进程:
ps aux | awk '$8 ~ /^D/ { print $0 }'
2、对每个D状态进程执行:
cat /proc/PID/stack(替换PID)
3、观察堆栈是否包含nfs、drbd、raid、nvme或特定驱动函数名
4、检查dmesg最新内核日志:
dmesg -T | tail -30
5、若dmesg中出现“NMI watchdog: BUG: soft lockup”或“nvme 0000:01:00.0: timeout while waiting for completion”类报错,需升级对应驱动或禁用相关模块








