У меня есть тестовый сервер с сетевой картой Mellanox ConnectX-5 (MT27800 Family, 100GbE, двухпортовая QSFP28). Сервер работает под управлением Proxmox 8.4. Для тестирования я создал виртуальную машину с Ubuntu 22.04 (VM 1). Я выделил один порт сетевой карты Mellanox виртуальной машине с помощью технологии PCI Passthrough. У меня также есть второй идентичный сервер с аналогичной виртуальной машиной (VM 2). Два сервера соединены кабелем AOC 100G QSFP28 3m. Я пытаюсь протестировать пропускную способность канала 100G с использованием протокола UDP. На VM 1 я запускаю 8 экземпляров iperf3 в серверном режиме: # iperf3 -s -p 3001 -D -4 ; … ; iperf3 -s -p 3008 -D -4 На VM 2 я запускаю 8 экземпляров iperf3 в клиентском режиме: # iperf3 -c <vm1-ip> -Z -p 3001 -u -b 15G -l 3500 ; … ; iperf3 -c <vm1-ip> -Z -p 3008 -u -b 15G -l 3500 В результате общая скорость по всем 8 потокам составляет примерно 24 Гбит/с. Во время теста я наблюдаю, что один процессорный ядро на VM 1 загружено на 100%, в то время как остальные ядра простаивают. Загрузка одного ядра вызвана процессом ksoftirqd. Я понимаю, что этот процесс отвечает за обработку прерываний IRQ. Несколько таких процессов работают в ОС (равное количеству процессорных ядер), и, судя по многочисленным статьям в интернете, обработка прерываний должна быть параллельной на нескольких процессорных ядрах. Если установить обычный Ubuntu на серверах и запустить тот же тест, все работает как положено. Я получаю значительно более высокие скорости, и процессы ksoftirqd загружают несколько процессорных ядер. Это означает, что сетевая карта распределяет входящий UDP-трафик по нескольким очередям. Как можно добиться того же результата в виртуальной машине Proxmox?
