文章背景图

Linux 负载很高但 CPU 使用率不高:D 状态进程与 I/O 阻塞排查

2026-08-09
1
-
- 分钟

生产服务器的 load average 持续升高,但 top 中 CPU 仍有大量 idle,这通常不是计算能力不足。Linux 负载包含可运行任务,也会受到不可中断睡眠任务影响;磁盘、NFS、云盘或内核 I/O 路径阻塞时,进程可能进入 D 状态并推高负载。

一、确认负载是否持续异常

date
uptime
cat /proc/loadavg
nproc
vmstat 1 10

将 1、5、15 分钟负载与 CPU 核数对比,并观察趋势。单次采样不能说明问题;刚结束的突发任务也可能让 15 分钟负载暂时较高。

二、区分 CPU 忙还是任务等待

top
mpstat -P ALL 1 10
pidstat -u -r -d -w 1 10

关注 %us%sy%wa%st 和 idle:

  • user/system 高:继续定位 CPU 消耗进程。

  • iowait 高:检查块设备和存储延迟。

  • steal 高:虚拟机可能被宿主机争抢 CPU。

  • CPU idle 高但 load 高:重点查 D 状态任务、锁和短时任务堆积。

三、找到 D 状态进程

ps -eo state,pid,ppid,wchan:32,etimes,cmd | awk '$1 ~ /^D/'
ps -eo pid,ppid,stat,wchan:32,comm --sort=stat

STAT 为 D 表示任务正在不可中断等待,常见于块设备、NFS、FUSE 或驱动调用。记录 PID、父进程、持续时间和 wchan

具有 root 权限时,可以检查单个进程:

cat /proc/<pid>/stack
cat /proc/<pid>/wchan
ls -l /proc/<pid>/fd | head

不要对生产环境所有 PID 无限制遍历 /proc/*/stack,这会产生大量输出,也可能掩盖关键证据。

四、检查磁盘与块设备

iostat -xz 1 10
lsblk -o NAME,TYPE,SIZE,FSTYPE,MOUNTPOINTS
df -hT
df -ih
dmesg -T | grep -Ei 'I/O error|timeout|reset|blk_update|nvme|scsi|ext4|xfs' | tail -n 100

重点看 await、队列、设备利用率和错误日志。高利用率不一定等于故障,必须结合延迟、吞吐基线和业务类型判断。云盘还要检查 IOPS、吞吐额度及 burst credit。

五、检查 NFS 与远程存储

findmnt -t nfs,nfs4
nfsstat -m
nfsstat -c
mount | grep -E ' nfs| nfs4'

如果 D 状态进程的工作目录或文件描述符位于 NFS,检查服务端、网络、DNS 和挂载参数。硬挂载 NFS 在服务端不可用时可能让进程长时间等待,这是数据安全设计的一部分,不要直接更改为软挂载来掩盖故障。

六、检查内存回收与 PSI

free -h
vmstat 1 10
cat /proc/pressure/cpu
cat /proc/pressure/io
cat /proc/pressure/memory

持续的 memory pressure、swap in/out 或 direct reclaim 也会拖慢任务。PSI 能帮助判断任务因为 CPU、I/O 或内存资源不足而停顿的比例。

七、应急处理步骤

  1. 保存 psvmstatiostat、内核日志和故障时间。

  2. 判断阻塞源是本地盘、云盘、NFS、数据库盘还是驱动。

  3. 对业务入口限流或切流,防止新请求继续形成 D 状态堆积。

  4. 存储恢复后观察进程是否自动恢复,不要连续发送 kill -9

  5. 单节点无法恢复时,通过控制台做受控重启;重启前必须确认数据一致性、集群副本和文件系统风险。

D 状态进程通常无法被信号立即终止,因为它在等待内核操作完成。大量 kill -9 既不能解决底层 I/O,也会破坏现场。

八、长期治理

  • 监控 load、D 状态数量、PSI、磁盘延迟和内核 I/O 错误。

  • 为云盘 IOPS、吞吐和容量预留峰值空间。

  • NFS、分布式存储和本地盘分别建立可用性探测。

  • 应用设置合理超时与并发上限,防止故障时无限堆积线程。

  • 对关键节点保留控制台和故障转移能力。

“负载高”只是结果。真正有效的排查是找到任务在等什么,以及那个依赖为什么迟迟没有返回。

原创

Linux 负载很高但 CPU 使用率不高:D 状态进程与 I/O 阻塞排查

本文链接: Linux 负载很高但 CPU 使用率不高:D 状态进程与 I/O 阻塞排查

本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

评论交流

文章目录