Я знаю, что если процесс переходит в D
состояние, то это означает, что он находится в непрерываемом состоянии. Процесс не может быть остановлен никаким сигналом. Он выйдет из этого состояния только при перезагрузке или если ожидание ввода-вывода закончится.
У меня много процессов в D
состоянии, которое показывает, что в моей машине что-то не так. Также даже после перезагрузки они возвращаются в D
состояние. Я поискал в интернете и обнаружил, что wchan
раздел в выводе ps говорит о том, чего в ядре ждет мой процесс.
Когда я использую эту команду, ps axl| grep D
я попадаю -
в столбец wchan, и в Интернете нет объяснения, что это значит.
Это мой пример вывода для приведенной выше команды.
0 0 69970 1 20 0 25064 1088 - D ? 0:00 ls -l
Я не могу понять, что -
имелось в виду в приведенном выше выводе.
решение1
Существует несколько возможных причин, по которым wchan сообщается -
как ps
:
- процесс просто не заблокирован в ядре, т.е. он запущен (см.
state
столбец ps) - the процедура обхода стекане удается из-за некоторых угловых случаев или условий гонки. Это может даже неуспешно безоговорочно, например, на ядрах, которые требуют правильных настроек указателя кадра, но были скомпилированы без них - проверьте это с
cat /proc/*/wchan
- все выходные данные 0 указывают на сломанную поддержку wchan (например, в настоящее время случай наФедора 31 и 32) - тыне имеюнеобходимостьразрешения режима доступа ptrace(а именно
PTRACE_MODE_READ_FSCREDS
) - маловероятно - the поиск символа не удалсяв ядре - маловероятно
Обратите внимание, что последняя ps
версия считывает информацию wchan, из /proc/$pid/wchan
которой вы можете получить прямой доступ cat
, для более легкого тестирования. Этот файл считывает, 0
если извлечение информации wchan не удалось, что ps
преобразуется в -
.
В системах, где wchan
произошел сбой, следует поискать замену (требуется root):
cat /proc/$pid/stack
Или, в качестве альтернативы, обратитесь к (не требуются права root):
cat /proc/$pid/syscall
решение2
в новом ядре Linux вы видите, в какой функции ядра застрял ваш процесс
cat /proc/<pid_numer>/stack
решение3
Страница руководства для ps содержит следующую информацию: «-» означает, что процесс запущен. Имя WCHAN функции ядра, в которой процесс находится в спящем режиме, «-», если процесс запущен, или «*», если процесс многопоточный и ps не отображает потоки.