D状态是进程在内核态不可中断等待资源(如I/O、NFS响应、驱动就绪或内存回收)的正常表现,但长期持续表明底层异常:磁盘I/O瓶颈、NFS挂起、驱动缺陷或内存压力过大,需结合iostat、dmesg、/proc/<pid>/stack等工具定位根因。

进程处于不可中断的D状态(Uninterruptible Sleep),通常意味着它正在内核态等待某个无法被信号打断的资源操作完成,最常见的是I/O等待。这种状态本身不是故障,但若长时间持续,则往往反映底层存在异常,需结合上下文深入排查。
磁盘I/O瓶颈或设备异常
这是D状态最典型的诱因。当进程发起同步读写(如read()、write()、fsync())后,内核需等待块设备驱动返回结果。若磁盘响应极慢、掉线、固件卡死,或使用了故障的NVMe SSD/USB存储,进程就会卡在__wait_event()等内核路径中,表现为持续D状态。
- 用iostat -x 1观察%util是否长期100%、await和r_await/w_await显著升高
- 检查dmesg是否有end_request: I/O error、timeout、reset等日志
- 对挂载点执行ls /mnt/badfs若卡住,基本可定位到该设备
网络文件系统(NFS/CIFS)挂起
NFS客户端默认使用硬挂载(hard mount),当服务器无响应或网络中断时,内核会重试并让调用进程进入不可中断等待,直到服务器恢复或超时(可能长达数分钟甚至更久)。CIFS在连接丢失且未配置soft或intr选项时也会出现类似行为。
- 运行mount | grep nfs确认挂载参数,重点关注hard/soft、timeo、retrans
- 用showmount -e nfs-server或rpcinfo -p测试NFS服务可达性
- 临时卸载可疑NFS路径:umount -f /mnt/nfs(强制卸载可能失败,此时需重启nfs-client服务或主机)
内核模块或驱动缺陷
某些定制或老旧的设备驱动(如RAID卡、加密模块、虚拟化增强驱动)在异常处理逻辑中未正确释放等待队列,或陷入死循环等待硬件就绪,会导致关联进程永久D状态。容器环境中的overlayfs、btrfs等高级文件系统在元数据损坏时也可能触发此类问题。
- 通过cat /proc/<pid>/stack查看D状态进程的内核栈,识别阻塞在哪个函数(如raid5_do_work、btrfs_start_transaction)
- 检查lsmod输出,比对近期是否加载过新驱动;升级内核或对应驱动版本常可规避已知缺陷
- 对疑似文件系统,可用btrfs filesystem show、xfs_info或dumpe2fs -h验证健康状态
内存回收与直接回收(Direct Reclaim)压力
在内存严重不足且无法异步回收时(如vm.swappiness=0且zone_reclaim_mode启用),内核可能在分配页过程中触发同步内存压缩或交换,导致进程卡在try_to_free_pages或shrink_inactive_list路径中。虽不常见,但在高负载+低内存+特定内核配置组合下可能发生。
- 监控free -h、cat /proc/meminfo | grep -E "MemAvailable|SwapFree"确认内存余量
- 观察vmstat 1中si(swap in)、so(swap out)是否频繁,pgmajfault是否突增
- 临时调整echo 1 > /proc/sys/vm/swappiness或禁用zone_reclaim_mode有助于缓解








