kworker线程的起源

Pat*_* B. 17 linux linux-kernel

在我使用内核3.2新安装的系统上,我看到一个不断消耗CPU的kworker线程.我想找出内核/模块的哪个部分创建了这个工作队列.

如何跟踪一个名为''kworker/0:3的kworker-thread到它在kernel-space中的起源?

我试着查看/ sys/kernel/debug/tracing/events/workqueue,但是无法弄明白.

ana*_*cat 19

(在我看来这是一个相当偏离的主题,但这是我在unix.stackexchange.com上发布的答案.)

我发现lkml上的这个帖子可以回答你的问题.(看起来连Linus本人都对如何找出这些线程的起源感到困惑.)

基本上,有两种方法可以做到这一点:

$ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
$ cat /sys/kernel/debug/tracing/trace_pipe > out.txt
(wait a few secs)
Run Code Online (Sandbox Code Playgroud)

为此,您需要在内核中编译ftrace.

这将输出线程正在执行的操作,并且对于跟踪多个小作业非常有用.

cat /proc/THE_OFFENDING_KWORKER/stack
Run Code Online (Sandbox Code Playgroud)

这将输出执行大量工作的单个线程的堆栈.它可能允许您找出导致此特定线程占用CPU的原因(例如).THE_OFFENDING_KWORKER是进程列表中kworker的pid.


Pat*_* B. 7

所以,过了一段时间我找到了解决方案.实际上Anthon是对的,它是发送中断的ACPI子系统.在我的系统上,我禁用了以下中断,并且kworker-thread被平静下来.

echo disable > /sys/firmware/acpi/interrupts/gpe1B
echo disable > /sys/firmware/acpi/interrupts/gpe08
Run Code Online (Sandbox Code Playgroud)

但是到目前为止还没有确定哪些假IRQ来自gpe08gpe1B.

  • 你是怎么到达那些特定的中断的? (2认同)
  • IIRC,蛮力.在某个地方,我发现那些kworkers的来源在acpi-subsystem中,然后我一个接一个地禁用了一个gpe,发现这两个有效果. (2认同)