D 状态是什么意思
D 状态(不可中断睡眠)意味着进程正卡在内核里等待某件事完成,最常见的是磁盘或网络存储 IO。它与普通睡眠(S)的区别在于:处于 D 状态的进程连信号都不响应,kill -9 也杀不掉,必须等底层操作返回或超时。因此排查方向不在进程本身,而在它等待的存储与驱动链路。
基本信息
| 状态标识 | ps 输出 STAT 列为 D |
|---|---|
| 等待点查看 | cat /proc/<PID>/wchan、/proc/<PID>/stack(需 root) |
| 常见源头 | 本地磁盘故障、网络存储断链、存储驱动或固件问题 |
| 信号特性 | kill -9 对 D 状态无效 |
| 权限要求 | root 查看内核调用栈 |
典型使用场景
- 系统负载极高但 CPU 使用率不高,怀疑有进程卡在 IO
- 应用无响应,进程处于 D 状态长时间不退出
- 网络存储(NFS、iSCSI)异常后系统整体变慢
- 重启过程反复卡住并伴随 hung task 告警
- 存储扩容或链路变更后的稳定性确认
定位等待点
定位等待点
ps -eo pid,stat,wchan:24,cmd | awk '$2 ~ /D/' | head # 列出 D 状态进程与等待点
cat /proc/<PID>/wchan # 内核等待函数名
cat /proc/<PID>/stack 2>/dev/null | head # 内核调用栈(需 root)
cat /proc/<PID>/status | grep -E 'State|VmRSS' # 状态与内存占用
dmesg -T | grep -iE 'blocked for more than|hung task|I/O error' | tail
iostat -x 1 3 # 对应磁盘的 IO 指标
mount | grep <挂载点> # 确认是否为网络存储等待点与指向
| 等待点或告警 | 含义 | 处理方向 |
|---|---|---|
| wchan 指向文件系统或块层 | 等待磁盘与存储 IO | 查磁盘健康与存储链路 |
| wchan 指向网络文件系统 | 等待远端存储响应 | 查网络与存储服务端 |
| dmesg 出现 hung task | 任务长时间未返回 | 按存储链路故障处理 |
| iostat 中 %util 接近 100 | 设备长期满负荷 | 定位热点并评估扩容 |
D 状态进程不可 kill:必须等底层恢复(网络存储重连、存储侧处理完成);盲目重启可能让故障面扩大,共享存储场景尤其明显。
要区分「偶发短暂 D」与「长时间 D」:大量进程短时间内进入 D 又退出,通常是 IO 抖动;持续数十分钟不结束的 D 状态才是故障信号。