31.4. 割り込み要求の概要
割り込み要求または IRQ は、ハードウェアの一部からプロセッサーに直ちに送信されるシグナルです。システム内の各デバイスには、固有の割り込みを送信できる IRQ 番号が割り当てられます。割り込みが有効になっていると、割り込み要求を受信するプロセッサーは割り込み要求に対応するために現在のアプリケーションスレッドの実行を即時に一時停止します。
割り込みは通常の動作を停止するため、割り込み率が高くなると、システムのパフォーマンスが大幅に低下する可能性があります。割り込みの親和性を設定するか、優先度の低い割り込みをバッチ (複数の割り込みをまとめる) に送信することで、割り込みにかかる時間を低減することができます。
割り込み要求には関連するアフィニティープロパティー smp_affinity
があり、割り込み要求を処理するプロセッサーを定義します。アプリケーションのパフォーマンスを向上させるには、割り込みの親和性とプロセスの親和性を同じプロセッサーまたは同じコアにあるプロセッサーに割り当てます。これにより、指定された割り込みとアプリケーションスレッドがキャッシュラインを共有できるようになります。
割り込みステアリングに対応するシステムでは、割り込み要求の smp_affinity
プロパティーを変更するとハードウェアが設定され、カーネルを介入することなくハードウェアレベルで特定のプロセッサーに割り込みを処理させる決定が行われるようになります。
31.4.1. 割り込みの手動分散
BIOS が NUMA トポロジーをエクスポートする場合、irqbalance
サービスは、サービスを要求するハードウェアに対してローカルとなるノードで割り込み要求を自動的に処理できます。
手順
- 設定する割り込み要求に対応するデバイスを確認します。
プラットフォームのハードウェア仕様を見つけます。システムのチップセットが割り込みの分散に対応しているかどうかを確認します。
- その場合には、以下の手順に従って割り込み配信を設定できます。また、チップセットが割り込みの分散に使用するアルゴリズムを確認してください。BIOS によっては割り込み配信を設定するオプションがあります。
- そうでない場合は、チップセットは常にすべての割り込みを単一の静的 CPU にルーティングします。使用される CPU を設定することはできません。
システムでどの Advanced Programmable Interrupt Controller (APIC) モードが使用されているかを確認します。
$ journalctl --dmesg | grep APIC
ここでは、以下のようになります。
-
システムが
flat
以外のモードを使用している場合は、APIC ルーティングの物理フラットへの設定
と同様の行が表示されます。 このようなメッセージが表示されない場合は、システムが
flat
モードを使用します。システムで
x2apic
モードを使用している場合は、bootloader
設定のカーネルコマンドラインにnox2apic
オプションを追加して無効にできます。物理以外のフラットモード (
flat
) のみが、複数の CPU への割り込みの分散をサポートします。このモードは、CPU が最大8
のシステムでのみ利用できます。
-
システムが
-
smp_affinity マスク
を計算します。smp_affinity mask
の計算方法については、smp_affinity マスクの設定 を参照してください。
関連情報
-
システム上の
journalctl(1)
およびtaskset(1)
man ページ
31.4.2. smp_affinity マスクの設定
smp_affinity
の値は、システム内のすべてのプロセッサーを表す 16 進数のビットマスクとして保存されます。各ビットは異なる CPU を設定します。最も大きなビットは CPU 0 です。
マスクのデフォルト値は f
で、割り込み要求をシステム内のどのプロセッサーでも処理できることを意味します。この値を 1 に設定すると、プロセッサー 0 のみが割り込みを処理できます。
手順
バイナリーでは、割り込みを処理する CPU に 1 の値を使用します。たとえば、割り込みを処理する CPU 0 と CPU 7 を設定するには、バイナリーコードに
0000000010000001
を使用します。表31.1 CPU のバイナリービット CPU
15
14
13
12
11
10
9
8
7
6
5
4
3
2
1
0
バイナリー
0
0
0
0
0
0
0
0
1
0
0
0
0
0
0
1
バイナリーコードを 16 進数に変換します。
たとえば、Python を使用してバイナリーコードを変換するには、次のコマンドを実行します。
>>> hex(int('0000000010000001', 2)) '0x81'
プロセッサーが 32 個を超えるシステムでは、32 ビットグループごとに
smp_affinity
値を区切る必要があります。たとえば、64 プロセッサーシステムの最初の 32 プロセッサーのみが割り込み要求を処理できるようにするには、0xffffffff,00000000
を使用します。特定の割り込み要求の割り込み親和性の値は、関連付けられた
/proc/irq/irq_number/smp_affinity
ファイルに保存されます。このファイルでsmp_affinity
マスクを設定します。# echo mask > /proc/irq/irq_number/smp_affinity
関連情報
-
システム上の
journalctl(1)
、irqbalance(1)
、およびtaskset(1)
man ページ