Ubuntuの動作が少し遅いと感じていたので、Ubuntuで実行中のプロセスを確認しに行き、ksoftirqd/0
と呼ばれるCPUの50%などを使用しているものを見つけました。
このプロセスが何をするのか、なぜそれがそれほど多くのCPUを使用しているのか、そしてCPUの負荷を軽減する方法を知っている人はいますか?
コンピューターは、IRQ(割り込み要求)を介して接続されているデバイスと通信します。デバイスから割り込みが発生すると、オペレーティングシステムは実行中の処理を一時停止し、その割り込みのアドレス指定を開始します。
状況によっては、IRQが次々と非常に高速になり、オペレーティングシステムは、次のものが到着する前にサービスを終了できません。これは、高速ネットワークカードが短時間で非常に多くのパケットを受信したときに発生する可能性があります。
オペレーティングシステムはIRQが到着するとすぐに処理できないため(次々に速く到着するため)、ksoftirqd
という名前の特別な内部プロセスによる後の処理のためにキューに入れられます。
ksoftirqd
がCPU時間のごくわずかな割合を占めている場合、これはマシンに大きな割り込み負荷がかかっていることを示しています。
マニュアルページから、ksoftirqd
は、マシンがソフト割り込みの負荷が重いときに実行されるCPUごとのカーネルスレッドです。
どのCPUが特定の割り込みを取得するかを定義することで、設定を少し調整できます。これを行うには、/proc/irq/$interrupt_number/smp_affinity
の内容を変更します。以下を実行することで、割り込みとその意味のリストを取得できます。
cat /proc/interrupts
smp_affinity
の数値はcpusのビットマップで、16進コードで表されます。右端のビットが最下位です。たとえば、私のシステムには8つのコアがあります。コア1、3、4のみを使用する場合は、smp_affinityを1a
に設定します。
cpu_7 cpu_6 cpu_5 cpu_4 cpu_3 cpu_2 cpu_1 cpu_0
0 0 0 1 1 0 1 0 = 0001 1010 = 1a (in hex)
個人的には、割り込み29(私の8コアシステムではeth0)をピックアップできるようにCPUをセットアップしました。
Sudo echo ff > /proc/irq/29/smp_affinity
ksoftirqdはCPUごとのカーネルスレッドであり、マシンに大きなソフト割り込み負荷がかかっているときに実行されるため、CPUを消費するのではなく、IRQの負荷を減らします。