Red Hat Training

A Red Hat training course is available for RHEL 8

31.4. 割り込み要求の概要

割り込み要求または IRQ は、ハードウェアの一部からプロセッサーに直ちに送信されるシグナルです。システム内の各デバイスには、固有の割り込みを送信できる IRQ 番号が割り当てられます。割り込みが有効になっていると、割り込み要求を受信するプロセッサーは割り込み要求に対応するために現在のアプリケーションスレッドの実行を即時に一時停止します。

割り込みは通常の動作を停止するため、割り込み率が高くなると、システムのパフォーマンスが大幅に低下する可能性があります。割り込みの親和性を設定するか、優先度の低い割り込みをバッチ (複数の割り込みをまとめる) に送信することで、割り込みにかかる時間を低減することができます。

割り込み要求には関連するアフィニティープロパティー smp_affinity があり、割り込み要求を処理するプロセッサーを定義します。アプリケーションのパフォーマンスを向上させるには、割り込みの親和性とプロセスの親和性を同じプロセッサーまたは同じコアにあるプロセッサーに割り当てます。これにより、指定された割り込みとアプリケーションスレッドがキャッシュラインを共有できるようになります。

割り込みステアリングに対応するシステムでは、割り込み要求の smp_affinity プロパティーを変更するとハードウェアが設定され、カーネルを介入することなくハードウェアレベルで特定のプロセッサーに割り込みを処理させる決定が行われるようになります。

31.4.1. 割り込みの手動分散

BIOS が NUMA トポロジーをエクスポートする場合、irqbalance サービスは、サービスを要求するハードウェアに対してローカルとなるノードで割り込み要求を自動的に処理できます。

手順

  1. 設定する割り込み要求に対応するデバイスを確認します。
  2. プラットフォームのハードウェア仕様を見つけます。システムのチップセットが割り込みの分散に対応しているかどうかを確認します。

    1. その場合には、以下の手順に従って割り込み配信を設定できます。また、チップセットが割り込みの分散に使用するアルゴリズムを確認してください。BIOS によっては割り込み配信を設定するオプションがあります。
    2. そうでない場合は、チップセットは常にすべての割り込みを単一の静的 CPU にルーティングします。使用される CPU を設定することはできません。
  3. システムでどの Advanced Programmable Interrupt Controller (APIC) モードが使用されているかを確認します。

    $ journalctl --dmesg | grep APIC

    ここでは、以下のようになります。

    • システムが flat 以外のモードを使用している場合は、APIC ルーティングの物理フラットへの設定 と同様の行が表示されます。
    • このようなメッセージが表示されない場合は、システムが flat モードを使用します。

      システムで x2apic モードを使用している場合は、bootloader 設定のカーネルコマンドラインに nox2apic オプションを追加して無効にできます。

      物理以外のフラットモード (flat) のみが、複数の CPU への割り込みの分散をサポートします。このモードは、CPU が最大 8 のシステムでのみ利用できます。

  4. 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 のみが割り込みを処理できます。

手順

  1. バイナリーでは、割り込みを処理する 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

  2. バイナリーコードを 16 進数に変換します。

    たとえば、Python を使用してバイナリーコードを変換するには、次のコマンドを実行します。

    >>> hex(int('0000000010000001', 2))
    
    '0x81'

    プロセッサーが 32 個を超えるシステムでは、32 ビットグループごとに smp_affinity 値を区切る必要があります。たとえば、64 プロセッサーシステムの最初の 32 プロセッサーのみが割り込み要求を処理できるようにするには、0xffffffff,00000000 を使用します。

  3. 特定の割り込み要求の割り込み親和性の値は、関連付けられた /proc/irq/irq_number/smp_affinity ファイルに保存されます。このファイルで smp_affinity マスクを設定します。

    # echo mask > /proc/irq/irq_number/smp_affinity

関連情報

  • journalctl(1)irqbalance(1)、および taskset(1) の man ページ