ps 命令中无法识别的进程状态输出

pka*_*mol 7 process ps

ps aux在运行中Ubuntu 18.04我看到一些进程具有 state 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]
Run Code Online (Sandbox Code Playgroud)

但是,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
Run Code Online (Sandbox Code Playgroud)

这是什么I状态?

slm*_*slm 11

意思是“空闲”

    /* states beyond TASK_REPORT: */
    "I (idle)",             /* 0x80 */
Run Code Online (Sandbox Code Playgroud) 参考:Linux 进程状态“I”在顶部输出中是什么意思?

在内核源代码中挖掘更多,我发现 I 的记录是TASK_REPORT_IDLE__get_task_state当进程状态为 TASK_IDLE 时从内核胆量(函数)返回,这实际上是

#define TASK_IDLE   (TASK_UNINTERRUPTIBLE | TASK_NOLOAD)
Run Code Online (Sandbox Code Playgroud)

另外,请参阅题为:sched/wait: Introduce TASK_NOLOAD 和 TASK_IDLE的内核提交。

目前人们习惯于TASK_INTERRUPTIBLE空闲kthreads并等待“工作”,因为这TASK_UNINTERRUPTIBLE会增加负载。让所有空闲的资源都kthreads贡献给 loadavg 有点傻。

现在大多数情况下都可以正常工作,因为kthreads它们的所有信号都被屏蔽了。但是,有一些站点会导致问题并且 TASK_UNINTERRUPTIBLE应该使用,除了 loadavg 问题。

此补丁添加了TASK_NOLOAD其中的内容,结合使用 TASK_UNINTERRUPTIBLE可避免 loadavg 记帐。

由于大多数想象的使用站点都是线程想要空闲、等待工作的循环,TASK_IDLE因此引入了一个帮助程序。

注意:这似乎已在 4.14-rc3 中添加到Linux 内核中

sched/debug: 添加显式 TASK_IDLE 打印

/进程

鉴于这是来自 Linux 内核,下游工具(例如ps和 )top可以立即显示这个新状态I,而无需明确告知,因为它们从/proc.

您可以/proc通过以下方式查看 a的状态/proc/<PID>/stat

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

参考