Linux不断分叉“kworker”

Jay*_* AU 8 linux process kernel linux-kernel

我在物理服务器上新安装了一个 redhat 7.4,并且只有 oracle 数据库 12 C 运行在它上面。我发现有 200 多个进程是“kworker”,进程数量还在不断增加。

我想知道这个过程是关于什么的,为什么我的服务器不断地分叉这个过程?它应该是一个内核进程,但它似乎消耗了大量的进程 ID 和 CPU 负载。

谢谢你。

Chr*_*own 10

kworker 进程是内核工作进程,拥有许多进程可能是无害的。

内核工作线程可以做很多事情,比如一些随机的例子:

  • 执行页面缓存写回
  • 处理某些类型的硬件事件
  • 很多很多其他的东西

要了解任何 kworker 正在做什么,您可以查看/proc/<kworker_pid>/stack. 例如:

$ cat /proc/$(pgrep -of kworker)/stack
[<ffffffff85c0c705>] acpi_ns_evaluate+0x1bc/0x23a
[<ffffffff85bffe09>] acpi_ev_asynch_execute_gpe_method+0x98/0xff
[<ffffffff85be4e30>] acpi_os_execute_deferred+0x10/0x20
[<ffffffff8588dc21>] process_one_work+0x181/0x370
[<ffffffff8588de5d>] worker_thread+0x4d/0x3a0
[<ffffffff85893f1c>] kthread+0xfc/0x130
[<ffffffff8588de10>] process_one_work+0x370/0x370
[<ffffffff85893e20>] kthread_create_on_node+0x70/0x70
[<ffffffff858791ba>] do_group_exit+0x3a/0xa0
[<ffffffff85e6a2b5>] ret_from_fork+0x25/0x30
[<ffffffffffffffff>] 0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)

此 kworker 正在处理 ACPI 事件。您可以说出这一点,因为它在其“处理”函数中,process_one_work最终会导致与处理 ACPI 事件相关的函数(如acpi_os_execute_deferred)。

你可能会发现很多人都有这个堆栈,或者类似的东西:

[<ffffffff9409a37d>] worker_thread+0xbd/0x400
[<ffffffff940a0355>] kthread+0x125/0x140
[<ffffffff946780c5>] ret_from_fork+0x25/0x30
[<ffffffffffffffff>] 0xffffffffffffffff
Run Code Online (Sandbox Code Playgroud)

这些内核工作者只是坐着等待工作。

根据您的系统配置,拥有许多 kworker 很正常。除非他们积极制造问题,否则我不会担心他们。