.png)
Я работаю над приложением eBPF/XDP, работающим на сервере с сетевыми картами Intel 10G X550T, использующим драйвер ixgbe.
Мне нужен точный контроль над тем, как работа распределяется между ядрами, поэтому я отключаю irqbalance и вручную настраиваю IRQ affinity. Я написал небольшой скрипт на Python для чтения /proc/interrupts и /proc/irq/X/smp_affinity, чтобы показать, какие ядра ЦП должны обрабатывать прерывание для каждой очереди:
Сетевая карта int0 настроена на 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]
Это само по себе не было бы проблемой — просто перестановка ядер — но в этой машине есть несколько сетевых карт, и каждый раз, когда я пытаюсь напрямую назначить определенные ядра для обработки определенных очередей на определенных сетевых картах, нагрузка eBPF все портит таким образом, что всегда приводит к тому, что несколько сетевых карт обращаются к одним и тем же ядрам (чего я не хочу!).
Это ожидаемое поведение? Есть ли способ его отключить?
Редактировать (дополнительная информация):
Сами 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.
Извините, что не указал информацию о версии — это общая версия 5.15.0-79 для Ubuntu 22.04.
Дальнейшее редактирование:
Хм... когда загружается программа 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