我在物理服务器上新安装了一台redhat 7.4,并且只在其上运行oracle数据库12 C。我发现有超过200个进程是“kworker”,进程的数量还在不断增加。
我想知道这个过程是关于什么的以及为什么我的服务器不断地分叉这个过程?它应该是一个内核进程,但它似乎消耗了大量的进程ID和CPU负载。
谢谢。
答案1
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
该 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
这些内核工作人员只是坐着等待工作完成。
根据您的系统配置,拥有许多 kworkers 很可能是正常的。除非他们主动制造问题,否则我不会担心他们。