Così, dopo un po' di tempo ho trovato la soluzione. In effetti Anthon ha ragione, è il sottosistema ACPI che invia gli interrupt. Su mio system ho disabilitato i seguenti interrupt e il thread kworker è stato calmato.
echo disable > /sys/firmware/acpi/interrupts/gpe1B
echo disable > /sys/firmware/acpi/interrupts/gpe08
Tuttavia fino ad ora non ho identificato quali fossero gli IRQ fasulli provenienti da gpe08
e gpe1B
.
(Mi sembra che questo sia piuttosto fuori tema qui, ma ecco la risposta che ho postato su unix.stackexchange.com.)
Ho trovato questo thread su lkml che risponde un po' alla tua domanda. (Sembra che anche lo stesso Linus fosse perplesso su come scoprire l'origine di quei thread.)
Fondamentalmente, ci sono due modi per farlo:
$ echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
$ cat /sys/kernel/debug/tracing/trace_pipe > out.txt
(wait a few secs)
Per questo avrai bisogno che ftrace sia compilato nel tuo kernel.
Questo mostrerà cosa stanno facendo tutti i thread ed è utile per tracciare più piccoli lavori.
cat /proc/THE_OFFENDING_KWORKER/stack
Questo produrrà lo stack di un singolo thread facendo molto lavoro. Potrebbe consentirti di scoprire cosa ha causato questo thread specifico per monopolizzare la CPU (ad esempio). THE_OFFENDING_KWORKER
è il pid del kworker nell'elenco dei processi.