Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

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