Назад | Перейти на главную страницу

Как определить причину зависания статусных процессов `D`?

У меня есть несколько процессов, зависших от состояний непрерывного сна, и все они, по-видимому, связаны с auplink /var/lib/docker/aufs/mnt. Это связано с докером, и он ждет ввода-вывода, который никогда не завершится - я понимаю, но как определить точную причину? Как я могу узнать, какой ввод-вывод он ждет? Кроме того, действительно ли нет способа заставить эти застрявшие процессы уйти без жесткой перезагрузки?

Вы можете увидеть стек процесса:

cat /proc/<process pid>/stack

который предоставит вам информацию о том, что он делал, когда оказался в состоянии D.

echo w > /proc/sysrq-trigger; dmesg

скажет ядру сообщать обо всех трассировках стека для процессов D-состояния в буфере dmesg.

Процессы в D-состоянии нельзя убить. Бывают ситуации, когда процесс остается в D-состоянии в течение длительного времени, но иногда завершает ввод-вывод и может быть прерван на короткий период времени, а затем возвращается к той же операции ввода-вывода и снова попадает в D-состояние. Затем с

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

есть небольшая вероятность доставки сигнала KILL, пока процесс прерывается.