Нераспознанный вывод состояния процесса в команде ps

Запустив ps aux в Ubuntu 18.04 я вижу, что некоторые процессы имеют состояние I , как в …

 root 1 0.0 0.0 225520 9144 ? Ss 10:36 0:02 /sbin/init splash root 2 0.0 0.0 0 0 ? S 10:36 0:00 [kthreadd] root 4 0.0 0.0 0 0 ? I< 10:36 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? I< 10:36 0:00 [mm_percpu_wq] 

Однако это состояние не упоминается на страницах ps :

КОДЫ СОСТОЯНИЯ ПРОЦЕССА Ниже приведены различные значения, которые будут отображаться в выходных спецификаторах s, stat и state (заголовок “STAT” или “S”) для описания состояния процесса:

  D uninterruptible sleep (usually IO) R running or runnable (on run queue) S interruptible sleep (waiting for an event to complete) T stopped by job control signal t stopped by debugger during the tracing W paging (not valid since the 2.6.xx kernel) X dead (should never be seen) Z defunct ("zombie") process, terminated but not reaped by its parent For BSD formats and when the stat keyword is used, additional characters may be displayed: < high-priority (not nice to other users) N low-priority (nice to other users) L has pages locked into memory (for real-time and custom IO) s is a session leader l is multi-threaded (using CLONE_THREAD, like NPTL pthreads do) + is in the foreground process group 

Что это I заявляю?

    Это значит “холостой”

      /* states beyond TASK_REPORT: */ "I (idle)", /* 0x80 */ 

    Ссылка: Что означает состояние процесса Linux “I” в верхнем выводе?

    Копаясь больше в источниках ядра, я обнаружил, что запись для I – TASK_REPORT_IDLE , которая возвращается из кишок ядра (функция __get_task_state ), когда процесс имеет статус TASK_IDLE, который фактически является комбинацией

     #define TASK_IDLE (TASK_UNINTERRUPTIBLE | TASK_NOLOAD) 

    Также посмотрите этот коммит к ядру под названием: sched / wait: введите TASK_NOLOAD и TASK_IDLE .

    В настоящее время люди используют TASK_INTERRUPTIBLE для простоя kthreads и ждут «работы», потому что TASK_UNINTERRUPTIBLE вносит TASK_UNINTERRUPTIBLE вклад в loadavg. Иметь все холостые kthreads способствующие загрузке, несколько глупо.

    Теперь в основном это работает нормально, потому что все сигналы kthreads замаскированы. Однако есть несколько сайтов, где это вызывает проблемы, и следует использовать TASK_UNINTERRUPTIBLE , за исключением проблемы loadavg.

    Этот патч добавляет TASK_NOLOAD который в сочетании с TASK_UNINTERRUPTIBLE позволяет избежать учета загрузки.

    Поскольку большинство предполагаемых сайтов использования представляют собой циклы, где stream хочет простаивать, ожидая работы, вводится вспомогательный TASK_IDLE .

    ПРИМЕЧАНИЕ. Похоже, что это было добавлено к ядру Linux в 4.14-rc3 :

    sched / debug: добавить явную печать TASK_IDLE

    / Proc

    Учитывая, что это исходит от ядра Linux, нижестоящие инструменты, такие как ps и top могут немедленно отобразить это новое состояние, I , без необходимости явного уведомления, поскольку они получают свою информацию из /proc .

    Вы можете увидеть состояние /proc через /proc//stat :

     $ cat /proc/10/stat 10 (lru-add-drain) S 2 0 0 0 -1 69247072 .... ^--- state = S = Sleep 

    Рекомендации

    • человек 5 проц