Происхождение kworker-thread

В моей недавно установленной системе с использованием ядра 3.2 я вижу поток kworker, который постоянно потребляет процессор. Я хотел бы узнать, какая часть ядра/модуля создала этот рабочий вопрос.

Как отслеживать поток kworker, названный, например, '' kworker/0: 3 в его начале в пространстве ядра?

Я попытался заглянуть в /sys/kernel/debug/tracing/events/workqueue, но не смог понять.

Ответы

Ответ 1

(Мне кажется, что это довольно не по теме, но здесь ответ Я отправил на unix.stackexchange.com.)

Я нашел этот поток на lkml, который немного отвечает на ваш вопрос. (Кажется, даже сам Линус был озадачен тем, как узнать происхождение этих потоков.)

В принципе, есть два способа сделать это:

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

Для этого вам понадобится ftrace для компиляции в вашем ядре.

Это будет выводить все потоки, и это полезно для отслеживания нескольких небольших заданий.

cat /proc/THE_OFFENDING_KWORKER/stack

Это приведет к тому, что стек одного потока будет выполнять большую работу. Это может позволить вам узнать, что вызвало этот конкретный поток для зависания процессора (например). THE_OFFENDING_KWORKER - это pid kworker в списке процессов.

Ответ 2

Итак, через некоторое время я нашел решение. На самом деле Anthon прав, это ACPI-подсистема, которая отправляет прерывания. В моей системе я отключил следующие прерывания, и kworker-thread успокоился.

echo disable > /sys/firmware/acpi/interrupts/gpe1B
echo disable > /sys/firmware/acpi/interrupts/gpe08

Однако до сих пор не были определены, какие фиктивные IRQ появляются от gpe08 и gpe1B.

Ответ 3

kworker/сторожевой таймер, вызывающий высокую нагрузку, когда не на кабеле питания - обходное решение

У вас есть kworker (причина kernel_thread_helper + 0x6/0x10?) thread 1, до 100% от процессора в течение 1 секунды каждые 5 секунд, только если ноутбук питается от кабеля. Нет проблем с питанием от батареи. Не имеет значения, заряжена ли батарея.

Это было более или менее неожиданно, поэтому я думаю, что недавнее обновление Ubuntu стало причиной (3.2.0-55-generic-pae сейчас).

Ищет полдня, пытаясь выяснить причину первопричины и попытаться отключить все прерывания acpi, что не имеет значения.

Добавление GRUB_CMDLINE_LINUX_DEFAULT = "acpi = off" в /etc/defaults/grub помогло в конце.

Как я выяснил сейчас, я добавил его с помощью этих специальных специальных кодов Unicode, которые могли бы объяснить несовместимость с "тихим всплеском" (с котировками по умолчанию), который озадачил меня. Я должен изучить некоторые проблемы с grub (меню загрузки не отображается, но я пытаюсь, не используется настройка по умолчанию, не используется...), поэтому я оставлю это тестирование позже.

PS: через неделю проблема вернется (без перезапуска, только приостановка между ними). Возможно, существует корреляция с использованием мыши usb. Power down/power up помогли (перезагрузка не была). Бросил все варианты grub. Я ожидаю, что проблема появится снова когда-нибудь.

PPS: Взял некоторое время (полгода), но он снова вернулся после возобновления работы с бараном. Нет недавних обновлений, просто подключая/отключая питание, как я часто это делаю. USB-устройства не подключены и не подключены. Если во время приостановки выполнялся тотем (но ничего не играл). Power down/power up с подключенным силовым кабелем не помогло, отключилось питание/питание при отключенном кабеле питания.

Ответ 4

kworker - это поток ядра, который обрабатывает workqueues. Этот поток создается в файле linux/kernel/workqueue.c.