4.3. 割り込みおよび IRQ チューニング
割り込み要請 (IRQ) は、ハードウェアレベルで送信されるサービスの要請です。割り込みは情報パケット (Message Signaled Interrupt または MSI) として専用ハードウェアラインまたはハードウェアバスで送信できます。
割り込みが可能になると、IRQ の受信で割り込みコンテキストへの切り替えが促されます。カーネル割り込み発送コードが IRQ 番号と関連する登録済みの割り込みサービスルーチン (ISR) のリストを検索し、各 ISR を順番に呼び出します。ISR は割り込みを承認し、同一の IRQ からの重複割り込みを無視します。その後、保留ハンドラーをキューに入れて割り込み処理を完了し、ISR が今後の割り込みを無視しないようにします。
/proc/interrupts
ファイルは、I/O デバイスあたりの CPU あたりの割り込み数を一覧表示します。表示されるのは、IRQ 番号、各 CPU コアが処理するその割り込みの番号、割り込みのタイプ、その割り込みを受信するために登録されているドライバーのコンマ区切り一覧、です。(詳細に関しては、proc(5) の man ページ: man 5 proc
を参照してください。)
IRQ には関連する「アフィニティ」プロパティー、
smp_affinity
、があり、これはその IRQ の ISR の実行を許可する CPU コアを定義します。このプロパティーは、割り込みアフィニティとアプリケーションのスレッドアフィニティの両方を 1 つ以上の特定の CPU コアに割り当てることでアプリケーションのパフォーマンスを改善します。これにより、指定割り込みとアプリケーションスレッド間のキャッシュライン共有が可能になります。
特定の IRQ 番号の割り込みアフィニティ値は、関連する
/proc/irq/IRQ_NUMBER/smp_affinity
ファイルに保存され、root ユーザーはこれを閲覧、修正できます。このファイルに保存された値は 16 進法のビットマスクで、システムの全 CPU コアを表します。
以下の例では、4 つの CPU コアがあるサーバー上のイーサネットドライバーに割り込みアフィニティを設定するために、まずイーサネットドライバーに関連する IRQ 番号を決定します。
# grep eth0 /proc/interrupts 32: 0 140 45 850264 PCI-MSI-edge eth0
IRQ 番号を使って適切な
smp_affinity
ファイルの位置を特定します。
# cat /proc/irq/32/smp_affinity f
smp_affinity のデフォルト値は
f
で、これはシステム内のどの CPU でも IRQ が実行できることを意味します。以下のようにこの値を 1
に設定すると、CPU 0 のみがこの割り込みを実行できることになります。
# echo 1 >/proc/irq/32/smp_affinity # cat /proc/irq/32/smp_affinity 1
コンマを使って
smp_affinity
値を別々の 32 ビットグループに設定することができます。32 コアを超えるシステムでは、これが必要になります。例えば、以下の例では IRQ 40 が 64 コアシステムの全コア上で実行されることを示しています。
# cat /proc/irq/40/smp_affinity ffffffff,ffffffff
IRQ 40 を 64 コアシステムの上位 32 コアのみで実行するには、以下のようにします。
# echo 0xffffffff,00000000 > /proc/irq/40/smp_affinity # cat /proc/irq/40/smp_affinity ffffffff,00000000
注記
割り込みステアリングをサポートするシステムでは、IRQ の
smp_affinity
を修正することでハードウェアを設定し、割り込みを特定の CPU で実行する決定がカーネルからの干渉なしにハードウェアレベルでできるようになります。