如何确定卡在“D”状态进程的原因?

如何确定卡在“D”状态进程的原因?

在此处输入图片描述

我有几个进程卡在不可中断的睡眠状态,似乎都是由 引起的auplink /var/lib/docker/aufs/mnt。这是与 docker 相关的事情,它正在等待一个永远无法完成的 I/O——我知道,但我如何确定确切的原因?我怎么知道它在等待什么 I/O?此外,真的没有办法让这些卡住的进程在不硬重启的情况下消失吗?

答案1

您可以查看该进程的堆栈:

cat /proc/<process pid>/stack

它将向您提供当它进入 D 状态时正在做什么的信息。

echo w > /proc/sysrq-trigger; dmesg

将告诉内核在 dmesg 缓冲区中报告 D 状态进程的所有堆栈跟踪。

处于 D 状态的进程无法被终止。在某些情况下,进程会长时间处于 D 状态,但偶尔会完成 I/O 并在短时间内可中断,然后返回相同的 I/O 活动并再次处于 D 状态。然后使用

while (true); do kill -9 PID; done

当进程可中断时,发出 KILL 信号的机会很小。

相关内容