D状态进程需先用ps和/proc/PID/stack定位阻塞点,确认为本地磁盘IO挂起后,通过dmesg和smartctl隔离故障设备,再执行echo 1 > /sys/block/sdX/device/delete或NVMe重置指令触发内核清理请求队列,使进程自动唤醒。

当Linux系统中某个进程因硬盘IO挂起而卡在D状态(不可中断睡眠),既不能kill -9终止,又不能放任其拖垮负载,需通过定位阻塞点→隔离故障设备→触发内核重置路径的方式实现平滑解锁,避免整机重启或文件系统损坏。
确认D态进程及其阻塞内核函数
执行ps -eo pid,comm,state,wchan:30,WCHAN:40 | awk '$3 ~ /^D$/ {print $0}',筛选出D态进程及对应wchan字段。
若wchan显示为blk_mq_do_dispatch_sched、__wait_on_bit或nvme_queue_rq,说明进程正卡在块设备调度层,基本锁定为本地磁盘IO挂起;若为nfs_wait_event则属NFS问题,不在此流程处理范围内。
对每个PID运行cat /proc/PID/stack(需root权限),确认栈顶是否含ext4_writepages或bio_wait——这是写入文件系统时等待底层完成的明确信号。
定位并隔离故障物理设备
方法一:通过dmesg抓取最近硬件超时记录
运行dmesg -T | grep -i "timeout\|I/O error\|ata\|nvme" | tail -15,重点关注形如nvme0n1: I/O timeout, reset controller或ata1.00: failed command: READ FPDMA QUEUED的行,从中提取设备名(如nvme0n1或sdb)。
方法二:用smartctl验证磁盘健康
执行smartctl -a /dev/sdX(X替换为疑似故障盘符),重点检查Reallocated_Sector_Ct是否非零、Pending_Sector是否增长、UDMA_CRC_Error_Count是否飙升——【只要任一值异常,该盘必须立即隔离】。
Linux AI 服务器 — 将 Linux 服务器转换为本地 AI 推理集群。使用 systemd、NVIDIA CUDA 实现无头 Linux AI,零 GUI 开销。
方法三:临时卸载对应挂载点
若故障盘已挂载,先运行lsof +D /mount/point 2>/dev/null | head -5确认无关键进程占用,再执行umount -f -l /mount/point。懒卸载(-l)可使已打开文件句柄逐步释放,避免device busy报错。
触发内核设备重置流程
第一步:确认设备未被其他进程独占
执行lsof /dev/sdX 2>/dev/null或lsof /dev/nvme0n1 2>/dev/null,输出为空才可继续;若有残留进程,用kill -TERM尝试优雅终止,【切勿对D态进程本身执行kill】。
第二步:向内核发送设备删除指令
对SATA/SAS盘:执行echo 1 > /sys/block/sdX/device/delete;对NVMe盘:执行echo 1 > /sys/class/nvme/nvme0/reset_controller。此操作会强制内核断开设备连接并清空请求队列,所有卡在该设备上的D态进程将收到I/O完成通知并自动唤醒。
第三步:观察进程状态恢复
持续运行watch -n0.5 'ps -o pid,comm,state -p PID'(PID替换为目标进程号),通常1~3秒内state从D变为R或S;若超过5秒仍未变,说明重置失败,需检查控制器固件或物理连接。
这一步操作起来很简单,直接敲命令就行,但必须确保前两步已排除NFS、LVM快照等干扰因素,否则重置无效。

















