So does Bash first run through the whole script to find variables?
Нет. Как вы сами обнаружили в своем примере, Bash-скрипты выполняются сверху вниз.
Хорошей практикой является определение всех необходимых переменных в начале сценария.
Наконец нашел ответ. Оказывается, вопрос такой же, как этот вопрос с дополнительной информацией здесь и здесь . Ни в одном из них не упоминается проблема с тем, что htop показывает нулевое использование, так что это может быть несвязанной проблемой.
Как объяснено в приведенных выше ссылках, ответ состоял в том, чтобы использовать sudo grep. -r /sys/firmware/acpi/interrupts/
, а затем использовать echo "disable" /sys/firmware/acpi/interrupts/gpe6D
, чтобы отключить проблемное прерывание (с наибольшим присоединенным числом, в моем случаеgpe6D
).
Чтобы понять, что это была проблема, я использовал bfptrace
, как объяснено в вопросе, чтобы выполнить трассировку стека ядра и выяснить, где процессор тратит время, а затем bpftrace -e 'kprobe:acpi_ps_parse_aml /cpu == 0/ { printf("%d\n", tid); }'
, чтобы найти идентификатор потока ядра одного из перечисленные функции. Выяснилось, что проблемным потоком был kworker/0:3-kacpi_notify
, а затем, погуглив, выяснилось, что у других тоже были подобные проблемы с этим потоком ядра.