一部のハードウェアにおいて、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の前に追記するだけで次回起動時から自動で実行してくれます。