系统使用 ps aux 查看进程时,发现有状态为 I (大写i) 的进程,暂无发现由于这个状态导致的问题。
进程状态“I”,表示task_idle,即空闲的任务(进程),这个是在比较新版的内核中新增的状态,在原生的kernel中最早出现于4.14-rc3版本。
以往系统设计,使用 TASK_INTERRUPTIBLE 来使 kthreads 空闲并等待“工作”,因为 TASK_UNINTERRUPTIBLE 会导致负载增加。但让所有空闲的 kthread 都也接入负载计算,这显得不合理。
因为空闲时 kthreads 的所有信号都被屏蔽,大多数情况下这样的设计及工作机制是没有问题的。但是有一些站点会导致此问题,必须使用 TASK_UNINTERRUPTIBLE,除了 loadavg 负载计算。
所以在后面较新版本的内核中,新增了一补丁,提供了 TASK_NOLOAD ,与 TASK_UNINTERRUPTIBLE 结合使用时,避免了 loadavg 清算。在实际的使用场景中,大多数站点会存在 kthreads 想要闲置,等待工作的循环,因此也引入了TASK_IDLE。
像 ps 和 top 这些工具,因为是从 /proc 中获取到进程的状态信息,所以在更新内核之后,可以直接显示出这个新的状态。
参考链接:
https://unix.stackexchange.com/questions/462098/unrecognized-process-state-output-in-ps-command
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=80ed87c8a9ca0cad7ca66cf3bbdfb17559a66dcf
https://unix.stackexchange.com/questions/361245/what-does-an-idle-cpu-process-do
https://kernelnewbies.org/Linux_5.1
https://elixir.bootlin.com/linux/v4.14-rc3/source/fs/proc/array.c
http://man7.org/linux/man-pages/man1/ps.1.html