Вопрос или проблема
У меня есть CentOS 8 (3.10), работающий на VirtualBox 6.0… И у меня есть 2 вопроса о WCHAN
В руководстве man для ‘ps’ описано WCHAN как:
Blockquote nwchan WCHAN адрес ядровой функции, в которой процесс
спит (используйте wchan, если хотите узнать имя ядровой
функции). Запускаемые задачи будут отображаться с
дефисом (‘-‘) в этом столбце.Blockquote wchan WCHAN имя ядровой функции, в которой процесс
спит, “-” если процесс запущен, или
“*” если процесс многопоточный и ps не отображает потоки.
Я еще не видел “*”, но я регулярно вижу “?” в выводе команды “ps”. Обычно это связано с ядровым процессом rcu_sched, но “?” появляется и для других процессов. Я не нашел определения для “?”… Что это значит?
Мой второй вопрос касается несоответствия, которое я вижу между выводом команды ‘ps’ и графической утилитой ‘Диспетчер задач’. В выводе команды ‘ps’ я вижу несколько процессов в состоянии выполнения и у них стоит “-” под WCHAN. Однако в “Диспетчере задач” те же процессы будут в состоянии выполнения с кодом WCHAN “poll_schedule_timeout”. Насколько я понимаю, это указывает на то, что процесс ожидает ввода-вывода… Разве эти процессы не должны быть в состоянии сна?
Вопросительный знак “?” в выводе “ps”
Я не проверял исходный код “ps” в Linux, но, IMHO, “?” используется всегда, когда значение неизвестно для “ps”. Почему это происходит, нельзя ответить, не зная больше деталей.
Но самая распространенная причина этого – отсутствие разрешений: У пользователя вашего процесса “ps” нет разрешений на чтение деталей других процессов. Детали других процессов можно проверить, например, в каталоге /proc/PIDNUMBER/
– если у вас нет разрешений на просмотр деталей, то и процесс “ps”, запущенный вами, будет иметь ту же проблему с разрешениями.
Различный вывод “ps” и “Диспетчера задач”
К сожалению, на это нельзя ответить однозначно. На самом деле, я бы всегда ожидал различный вывод от двух экземпляров “ps” или “Диспетчера задач” или любого другого инструмента для отображения текущего состояния процессов, потому что каждую долю секунды состояние большинства процессов системы меняется! Каждый раз, когда вы запускаете инструмент, такой как “ps”, вы получаете снимок состояния на этот момент.
Даже если бы вы попытались запустить два экземпляра “ps” в одно и то же время, вывод различался бы на почти каждой системе, потому что “ps” сам по себе является просто процессом, получающим временные участки от ядра Linux/Unix, что приводит к тому, что два процесса “ps” получают данные от других процессов в разное время, и, следовательно, показывают разные значения.
Теоретически, если у вас есть система с, например, 200 процессорными ядрами и только 198 процессами, то два (новых) процесса “ps” могут показать один и тот же вывод. Теоретически – если оба процесса работают на своем собственном ядре ЦП и были запущены в одно и то же время!
Тестирование выводов:
Как правило, состояние процесса сильно меняется. Единственное состояние, которое может сохраняться некоторое время, – это “остановлено”. Это отображается как “T” (остановлено) в “ps”. Чтобы сравнить здесь “ps” и “Диспетчер задач”, вы можете попытаться отправить процессу сигнал STOP с помощью kill -STOP PIDNUMBER
, а затем сравнить вывод обоих инструментов для этого процесса. Чтобы продолжить выполнение процесса после сравнения, просто отправьте ему сигнал “продолжить” с помощью kill -CONT PIDNUMBER
. В качестве процесса вы можете использовать что-то вроде “sleep 3600”, что можно легко найти (или “grep”ом) в выводе “ps”.
Ответ или решение
Вопросы о значениях WCHAN на Linux
1. Знак вопроса "?" в выводе команды "ps"
Знак вопроса "?" в колонке WCHAN вывода команды "ps" указывает на то, что состояние или контекст, в котором находится процесс, не могут быть определены. Это может происходить по нескольким причинам, наиболее распространенные из которых:
-
Отсутствие прав доступа: В Linux предусмотрена система прав доступа к процессам. Если у пользователя, выполняющего команду "ps", нет прав для получения информации о других процессах, может отображаться "?", так как команда не может получить необходимые данные. Для проверки доступности информации можно попробовать просмотреть директорию
/proc/PIDNUMBER/
, гдеPIDNUMBER
– это идентификатор процесса. Если доступ запрещен, команда "ps" тоже не сможет извлечь подобные сведения. -
Особенности рабочей нагрузки: Иногда причина также может заключаться в том, что процесс временно не может определить свое рабочее состояние, особенно в случаях, когда происходит быстрое переключение контекстов.
2. Различия между выводом команды "ps" и графического утилиты "System Monitor"
Различия в выводе между "ps" и "System Monitor" могут быть объяснены несколькими факторами:
-
Природа отображаемых данных: Оба инструмента получают данные о состоянии процессов в момент времени, когда была выполнена команда. Поскольку системы многозадачны, состояния процессов могут быстро меняться. Это означает, что, даже если команды были запущены одновременно, данные могут отличаться из-за малейших изменений состояния процессов.
-
Состояния процессов: Команда "ps" показывает состояние процесса и может вернуть "WCHAN" со значением "-", если процесс работает. В то же время "System Monitor" может показывать "poll_schedule_timeout", что указывает на то, что процесс ожидал ввода-вывода.
Важно понимать, что состояние "ожидания" (например, ‘poll_schedule_timeout’) указывает на то, что процесс фактически ожидает какое-то событие, и его состояние меняется по мере обработки запросов. Поэтому, даже если процессов несколько и они находятся в состоянии выполнения, одни из них могут ожидать завершения ввода или выполнения других операций.
Заключение
В итоге, вопросы, касающиеся значений WCHAN, формируются как на основе пользовательских прав, так и из-за природы многозадачной операционной системы. Следует учитывать, что время выполнения процессов и их состояния могут меняться стремительно, что может вызвать трудности в интерпретации данных. Важно понимать, что "ps" и "System Monitor" могут отображать различные состояния одного и того же процесса в силу своей природы и времени обработки.