eBPF プログラムをロードすると、IRQ アフィニティが変更されます - (ixgbe ドライバー)

eBPF プログラムをロードすると、IRQ アフィニティが変更されます - (ixgbe ドライバー)

私は、ixgbe ドライバーを使用して、Intel 10G X550T NIC を搭載したサーバー上で実行される eBPF/XDP アプリケーションに取り組んでいます。

コア間で作業がどのように分散されるかを正確に制御する必要があるため、irqbalance を無効にして、IRQ アフィニティを手動で設定しています。/proc/interrupts と /proc/irq/X/smp_affinity を読み取り、各キューの割り込みをどの CPU コアが処理する必要があるかを示す簡単な Python スクリプトを作成しました。

int0 NIC は 40 個のキューで構成されており、マシンには 40 個のコアがあります。手動構成を実行した後、キュー -> コア マッピングは次のようになります。

# python3 show_ints.py
int0       : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

しかし、このデバイスに最も単純な eBPF プログラムをロードすると、次のようになります。

int xdp_sock_prog(struct xdp_md *ctx)
{
    return( XDP_PASS );
}
# xdp-loader load -m native int0 test.o

irq アフィニティが変更されたようです:

# python3 show_ints.py
int0       : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39]

これ自体は問題ではありません (コアの入れ替えだけ)。ただし、このマシンには複数の NIC があり、特定の NIC 上の特定のキューを処理するために特定のコアを直接割り当てようとするたびに、eBPF の負荷によって混乱が生じ、常に複数の NIC が同じコアにアクセスすることになります (これは望ましくありません)。

これは想定された動作ですか? 無効にする方法はありますか?

編集(追加情報):

IRQ 自体は変更されません...

前に:

int0       IRQs : [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181]
int0       CPUs : [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39]

後:

int0       IRQs : [79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181]
int0       CPUs : [0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39]

つまり、調整されるのは smp_affinity だけです。

バージョン情報を含めなかったことをお詫びします。これは Ubuntu 22.04 の汎用バージョン 5.15.0-79 です。

さらに編集:

うーん... eBPF プログラムがロードされると、dmesg には次のように表示されます:

[66216.150088] ixgbe 0000:3b:00.0: removed PHC on int0
[66216.927782] ixgbe 0000:3b:00.0: registered PHC device on int0
[66221.735857] ixgbe 0000:3b:00.0 int0: NIC Link is Up 10 Gbps, Flow Control: None

関連情報