首页/安全/应急响应速查/高负载低 CPU:揪出 D 状态进程

高负载低 CPU:揪出 D 状态进程

负载飙高但 CPU 空闲,通常是进程阻塞在不可中断 IO(D 状态):先定位卡点进程,再查它在等什么设备。

应急响应速查安全更新于 2026-10-13

D 状态与高负载

系统负载(load average)很高但 CPU 大量空闲,最常见的原因是进程阻塞在不可中断的 IO 上,也就是 ps 状态列为 D 的那些进程。它们在内核里等待磁盘、块设备或 NFS 返回,不消耗 CPU 却持续计入负载。所以只盯 CPU 使用率排查,会完全找不到原因。

基本信息

适用平台Linux
典型信号load average 高、CPU idle 高、进程状态为 D
定位方式ps -eo state,pid,user,cmd 过滤 D
常见原因磁盘或块设备 IO 阻塞、NFS 挂载点无响应、云盘限流
关联场景备份任务并发、挖矿或批量加密造成的大量读写
关键限制D 状态进程 kill -9 也杀不掉,需先解除 IO 阻塞

典型使用场景

  • 负载报警但 CPU 曲线平稳,需要定位真正的阻塞源
  • 数据库或文件服务响应变慢,判断是 IO 瓶颈还是应用问题
  • NFS、云盘挂载点无响应导致命令卡死时找出等待中的进程
  • 排查疑似挖矿、批量加密行为造成的异常磁盘压力
  • 评估扩容方向:究竟缺 CPU 还是缺 IO 能力

定位 D 状态进程与等待点

定位 D 状态进程与等待点
uptime                                                       # 先看三个负载数值
ps -eo state,pid,user,lstart,cmd | awk '$1 ~ /^D/' | head -n 20  # 揪出 D 状态进程
cat /proc/1234/stack 2>/dev/null | head -n 10                 # 内核栈:卡在哪一层
cat /proc/1234/wchan; echo                                    # 内核等待通道
cat /proc/1234/status | grep -E 'State|VmRSS'                 # 状态与内存占用
iostat -x 1 3 2>/dev/null | tail -n 20                        # 设备利用率与 await
mount | grep -E 'nfs|cifs|gluster'                            # 是否存在网络文件系统

关键字段读法

字段含义正常与异常
State (D)不可中断睡眠D 表示阻塞在内核 IO,S 是可中断睡眠
wchan内核等待通道指向具体驱动或文件系统调用
stack内核调用栈需 root 与内核支持,直接给出卡点
%util设备繁忙度持续接近 100% 说明设备已成瓶颈
await平均 IO 等待毫秒显著升高提示后端存储变慢
/proc/<PID>/stack 需要 root 且内核开启支持;拿不到栈时,用 wchan 配合 iostat、mount 输出综合判断阻塞位置。
对 D 状态进程反复 kill -9 无效:信号要等进程从不可中断睡眠返回才会被处理,先解决后端 IO 问题才是正路。
负载数值的分母是 CPU 核数,所以要先看核数再看数值:4 核机器负载 8 就是 2 倍超载,而 32 核机器负载 8 只算轻度。判断前用 nproc 确认核数,避免把小问题当事故。

易错点

  • 对 D 状态进程反复 kill -9:杀不掉还耽误处置时间,应先查阻塞的设备或挂载点
  • 把高负载全归因到 CPU:低 CPU 高负载的元凶通常正是 D 状态进程
  • 不看 iostat 就下结论:无法区分应用自身阻塞与存储后端性能问题
  • 未确认进程就重挂或强制重启挂载点:可能造成数据损坏和更长的恢复时间
  • 不看 CPU 核数直接比较负载数值:4 核与 32 核的同一负载值含义完全不同,会误判严重程度

数据来源与参考

  • procps-ng ps(1) 手册
  • Linux 内核文档:进程状态

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌