気がつくと 1 cpu が full load 状態で、ほぼ 100% に張り付いていた。
top とか ps aux で調べてみると、kworker/4:1 が犯人。
ググってみると結構ケースバイケースでいろいろ原因がある模様。
で、うちのケースでは以下の xhci が不具合発生してる状況が合致した
こういうケースでは linux-tools に入ってる perf コマンドを使って調査すると良いらしい。
そこで、以下のようにして、xhci_hcd をリセットしてみたところ一時的には解決するんだけど、しばらくすると再発する。
BIOS の「XHCI Hand-off」を「disable」にしとけってコメントもあったので試してみたが、これも効果なし。
以下のフォーラムでは usbcore の autosuspend を -1 にして無効にすると良いというコメント。
これはどうも上手く行ってそうな雰囲気なので、/etc/default/grub に以下の設定を追加しておいた。
top とか ps aux で調べてみると、kworker/4:1 が犯人。
ググってみると結構ケースバイケースでいろいろ原因がある模様。
- Google: kworker cpu
で、うちのケースでは以下の xhci が不具合発生してる状況が合致した
- Hatena Blog / nishikizw's diary / 2017-07-12: kworkerのCPU使用率が高すぎるのでなんとかした
- StackExchange / ask ubuntu / 2011-04-05: Kworker, what is it and why is it hogging so much CPU?
こういうケースでは linux-tools に入ってる perf コマンドを使って調査すると良いらしい。
$ sudo apt install linux-tools-generic-hwe-16.04-edge $ sudo perf record -g -a sleep 10 $ sudo perf report ... + 56.48% 56.24% kworker/4:1 [kernel.kallsyms] [k] xhci_hub_control ...のようにすることで xhci_hub_control が戦犯らしいことが判明。
そこで、以下のようにして、xhci_hcd をリセットしてみたところ一時的には解決するんだけど、しばらくすると再発する。
$ lspci -k|grep -i xhci 00:14.0 USB controller: Intel Corporation 9 Series Chipset Family USB xHCI Controller Subsystem: Micro-Star International Co., Ltd. [MSI] 9 Series Chipset Family USB xHCI Controller Kernel driver in use: xhci_hcd $ ls /sys/bus/pci/drivers/xhci_hcd/ 0000:00:14.0/ bind new_id remove_id uevent unbind $ echo -n 0000:00:14.0 | sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind; echo -n 0000:00:14.0 | sudo tee /sys/bus/pci/drivers/xhci_hcd/bind; echo 0000:00:14.00000:00:14.0
BIOS の「XHCI Hand-off」を「disable」にしとけってコメントもあったので試してみたが、これも効果なし。
以下のフォーラムでは usbcore の autosuspend を -1 にして無効にすると良いというコメント。
- Linux Mint Forums / 2017-02-26: SOLVED Kworker/USB maxing out single core
$ echo -1|sudo tee /sys/module/usbcore/parameters/autosuspend -1 $ echo -n 0000:00:14.0 | sudo tee /sys/bus/pci/drivers/xhci_hcd/unbind; echo -n 0000:00:14.0 | sudo tee /sys/bus/pci/drivers/xhci_hcd/bind; echo 0000:00:14.00000:00:14.0 $ cat /sys/module/usbcore/parameters/autosuspend -1
これはどうも上手く行ってそうな雰囲気なので、/etc/default/grub に以下の設定を追加しておいた。
GRUB_CMDLINE_LINUX_DEFAULT="usbcore.autosuspend=-1"
タグ
コメントをかく