eBPF 프로그램을 로드하면 IRQ 유사성이 수정됩니다. - (ixgbe 드라이버)

eBPF 프로그램을 로드하면 IRQ 유사성이 수정됩니다. - (ixgbe 드라이버)

저는 ixgbe 드라이버를 사용하여 Intel 10G X550T NIC가 있는 서버에서 실행되는 eBPF/XDP 애플리케이션을 작업하고 있습니다.

작업이 코어 간에 분산되는 방식을 정밀하게 제어해야 하므로 irqbalance를 비활성화하고 IRQ 선호도를 수동으로 설정합니다. 각 대기열에 대해 인터럽트를 처리해야 하는 CPU 코어를 표시하기 위해 /proc/interrupts 및 /proc/irq/X/smp_affinity를 읽는 간단한 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

관련 정보