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

enter image description here

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

1
задан 20 November 2018 в 04:17
1 ответ

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

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, пока процесс прерывается.

1
ответ дан 3 December 2019 в 23:10

Теги

Похожие вопросы