Путешествие по процессам Linux – kworker

348
Путешествие по процессам Linux - kworker
Путешествие по процессам Linux - kworker

Kworker – это поток ядра, который выполняет обработку как часть ядра, особенно в случае прерываний, таймеров, ввода/вывода (I/O) и т.д. Он основан на workqueues, которые являются механизмами асинхронного выполнения, которые выполняются в “контексте процесса” (более подробно о workqueus я расскажу отдельно, а пока это все, что вам нужно знать).

В целом, на машине Linux выполняется несколько kworker. Шаблон названий kworker включает: номер ядра, на котором он выполняется, идентификатор потока и может содержать строку, намекающую на то, что делает kworker (проверьте вывод ‘ps -ef | grep kworker’ – см. скриншот ниже).

вывод 'ps -ef | grep kworker'
вывод ‘ps -ef | grep kworker’

Главный вопрос – “Как мы узнаем, что делает каждый kwoker?”. Это большой вопрос, и мы собираемся ответить на него с помощью ftrace (трассировка функций внутри ядра – рекомендую почитать об этом подробнее – https://www.kernel.org/doc/Documentation/trace/ftrace.txt). Команды, которые мы будем использовать, следующие:

echo workqueue:workqueue_queue_work > /sys/kernel/debug/tracing/set_event
cat /sys/kernel/debug/tracing/trace_pipe > /tmp/trace.log

Первый включает трассировку относительно workqueus. Вторая считывает данные трассировки и сохраняет их в файл. Мы также можем выполнить команду “cat /sys/kernel/debug/tracing/trace_pipe | grep kworker” и изменить фильтр grep на определенный процесс kworker. В трассировке мы увидим имя функции, которую будет выполнять каждый поток kworker.

ftrace output (tracing kworker)
ftrace output (tracing kworker)