回答:
コンピューターは、IRQ(割り込み要求)を介して接続されているデバイスと通信します。デバイスから割り込みが発生すると、オペレーティングシステムは実行中の処理を一時停止し、その割り込みのアドレス指定を開始します。
状況によっては、IRQが次々と非常に高速になり、オペレーティングシステムは、次のものが到着する前にサービスを終了できません。これは、高速ネットワークカードが短時間で非常に多くのパケットを受信したときに発生する可能性があります。
オペレーティングシステムは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の負荷を減らします。