LinuxでCPUの一つが常時使用率100%になる問題

一部のハードウェアにおいて、kworkerが一つのスレッドをほぼ専有してしまうことがLinuxでは結構前から度々起きているようです。症状も様々で、有線LANを使うと発生すると言うもの、動画編集をすると発生すると言うもの、何もしなくても発生すると言うものなど様々なものがあるようです。 対症療法的でしかないのですが、一応解決策はあるのでメモしておきます。

grep . -r /sys/firmware/acpi/interrupts/

この中でenabledであり値が異様に高いものがあると思います。 それをrootで、

echo disable > /sys/firmware/acpi/interrupts/(先ほど見つけた値が異様に高いファイル) 

とするとCPU利用率が低下します。

自動化

ただこれを毎回起動するたびにやるのは面倒なので自動化します。

#!/usr/bin/zsh
echo disable > /sys/firmware/acpi/interrupts/(先ほど見つけた値が異様に高いファイル) 

などのような内容のシェルスクリプトを書き、chmodで実行可能にして/usr/local/binなどのパスが通っているディレクトリに配置します。

systemdの場合

[Unit]
Description = disable /sys/firmware/acpi/intterupts/gpe13

[Service]
#書いて配置したスクリプトに合わせてパスを変える
ExecStart = /usr/local/bin/disableGPE13
Type = simple
[Install]
#多分multi-user.targetで無くてもいい
WantedBy = multi-user.target

のようなserviceファイルを書いてdisableGPE.serviceなどの名前で/etc/systemd/systemディレクトリに配置したあと

systemctl daemon-reload
systemctl enable disableGPE

とroot権限でコマンドを打てば次回起動時から自動で実行してくれます。

upstartの場合

/etc/rc.localに

#gpe13は例
echo disable > /sys/firmware/acpi/interrupts/gpe13

などとexit 0の前に追記するだけで次回起動時から自動で実行してくれます。