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 で実行する決定がカーネルからの干渉なしにハードウェアレベルでできるようになります。

このページには機械翻訳が使用されている場合があります (詳細はこちら)。