Es un hilo del núcleo que ejecuta trabajo aplazado en "workqueues", una cola en la que el núcleo o los drivers meten tareas a ejecutar más tarde, normalmente como continuación de interrupciones de hardware, temporizadores del kernel o eventos de E/S, pero ya en contexto de proceso "normal" para no bloquear la CPU. Es decir, casi nunca es "el culpable" por sí mismo, sino el mensajero que hace tareas que otro subsistema ha pedido.
$ ps -ef | grep kworker
root 156852 2 0 20:27 ? 00:00:00 [kworker/u25:2-rtw_tx_wq]
root 65 2 0 15:51 ? 00:00:00 [kworker/R-writeback]
root 642 2 0 15:51 ? 00:00:00 [kworker/R-cryptd]
root 238 2 0 15:51 ? 00:00:00 [kworker/R-nvme-wq]
root 140703 2 0 19:59 ? 00:00:02 [kworker/u25:1-i915_flip]
root 478 2 0 15:51 ? 00:00:00 [kworker/R-tls-strp]
...
- Cada "kworker/...-XXX" suele indicar la workqueue o subsistema que está atendiendo; si uno de ellos "se dispara" en CPU, la causa suele estar en el subsistema que aparece en el sufijo.
- Estos sufijos [-writeback, -nvme-wq, -i915_flip, -rtw_tx_wq, etc] indican tareas normales de E/S, red, gráficos, RCU, etc., que cualquier sistema activo tiene.
- TIME cercano a 00:00:00 o a unos pocos segundos no indican ningún problema.
- Si uno o varios kworker/... se disparan al 80/100% de un core de forma permanente es preocupante,
Si se ve un kworker tragando CPU o provocando latencias [no es el caso], para localizarlo, anotar el PID [segunda columna] y lanzar:
# cat /proc/478/stack
[<0>] rescuer_thread+0x389/0x470
[<0>] kthread+0xcf/0x100
[<0>] ret_from_fork+0x31/0x50
[<0>] ret_from_fork_asm+0x1a/0x30
La traza dirá en qué función del kernel está gastando tiempo, por ejemplo algo de un driver, de net, de blk, etc.
# perf record -g -a -- sleep 5
# perf report
# perf kwork record -- sleep 5
# perf kwork report