So fand ich nach einiger Zeit die Lösung. Tatsächlich hat Anthon Recht, es ist das ACPI-Subsystem, das Interrupts sendet. Auf meinem system habe ich folgende Interrupts deaktiviert und der kworker-Thread ist beruhigt.
echo disable > /sys/firmware/acpi/interrupts/gpe1B
echo disable > /sys/firmware/acpi/interrupts/gpe08
Allerdings habe ich bis jetzt nicht herausgefunden, was die falschen IRQs von gpe08
kommen und gpe1B
.
(Mir scheint, das ist hier ziemlich off-topic, aber hier ist die Antwort, die ich auf unix.stackexchange.com gepostet habe.)
Ich habe diesen Thread auf lkml gefunden, der Ihre Frage ein wenig beantwortet. (Es scheint, dass sogar Linus selbst verwirrt war, wie er den Ursprung dieser Fäden herausfinden könnte.)
Grundsätzlich gibt es zwei Möglichkeiten, dies zu tun:
$ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
$ cat /sys/kernel/debug/tracing/trace_pipe > out.txt
(wait a few secs)
Dazu müssen Sie ftrace in Ihren Kernel kompilieren.
Dies gibt aus, was alle Threads tun, und ist nützlich, um mehrere kleine Jobs zu verfolgen.
cat /proc/THE_OFFENDING_KWORKER/stack
Dadurch wird der Stapel eines einzelnen Threads ausgegeben, der viel Arbeit macht. Es kann Ihnen helfen, herauszufinden, was diesen speziellen Thread dazu veranlasst hat, die CPU zu belasten (zum Beispiel). THE_OFFENDING_KWORKER
ist die PID des kworker in der Prozessliste.