Linux排查卡顿时,ps里常见R、S、D、T、Z等状态。D状态通常表示不可中断睡眠,进程正在等待某类内核资源或I/O完成。它和普通S状态的差别,是面试里很常见的系统排查问题。
关键点:D状态任务当前处于内核的不可中断等待中。SIGKILL并不是“立刻从任何上下文强行终止”,信号通常要等任务重新回到可处理信号的时机才能生效。

为什么要这样设计
先确认在等什么
查看/proc/<pid>/stack、wchan、内核日志和阻塞调用,判断是块设备、网络文件系统、驱动I/O还是锁/资源等待。
区分S与D
S是可中断睡眠,信号可以唤醒;D通常用于不希望中途破坏关键I/O状态的等待路径。
大量D状态要看系统层
如果大量进程同时进入D状态,优先关注磁盘超时、NFS、存储驱动、总线异常或底层设备不可达,而不是逐个kill进程。
面试时可以这样回答
看到D状态我不会先反复kill -9,而会查它当前阻塞在内核哪条路径。可以结合wchan、/proc/pid/stack、dmesg和I/O统计判断是否在等待块设备、文件系统或驱动。如果底层I/O迟迟不返回,SIGKILL也需要等任务离开不可中断睡眠后才有机会处理。若很多任务同时D住,我会把它当成系统级I/O问题处理,而不是单个应用程序问题。
继续追问
D状态一定代表磁盘故障吗?
Z僵尸进程和D状态的处理思路有什么完全不同?
驱动里把等待设计成不可中断睡眠有什么风险?
常见误区
把D状态解释成“进程死掉了”。
看到kill -9无效就直接判断Linux内核崩溃。
只看ps状态,不追踪内核栈和实际I/O等待对象。

扫码关注





























