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.
所以,过了一段时间我找到了解决方案.实际上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来自gpe08和gpe1B.
| 归档时间: |
|
| 查看次数: |
33446 次 |
| 最近记录: |