Я использую KVM/QEMU 7.2.0 с Linux как для хоста, так и для гостя (ядро 6.1.6 на x86_64). Для виртуальной сети я использую устройство моста на хосте, к которому гость подключает свою сетевую карту как tap
устройство:
-netdev {"type":"tap","vhost":true,"id":"hostnet0"}
-device {"driver":"virtio-net-pci","netdev":"hostnet0","id":"net0"}
С точки зрения QEMU, виртуальный гостевой сетевой интерфейс virtio-net-pci
должен иметь наилучшую производительность. Однако, virtio-net-pci
он дает мне только ~0,3 МБ/с скорости приема в гостевой системе, в то время как для сравнения переключение драйвера на e1000e
дает мне ~400 МБ/с.
Методом проб и ошибок я обнаружил, что если задать napi_weight=1
параметр для virtio_net
модуля в гостевой виртуальной машине, производительность возвращается к норме.
После прочтения NAPI я понял, что этот napi_weight
параметр используется для переключения между обслуживанием на основе прерываний и обслуживанием на основе опросов полученных пакетов. Обычно параметр по умолчанию имеет NAPI_POLL_WEIGHT
константу, которая равна 64. Я не могу понять основную причину проблемы и не хочу устанавливать этот параметр только потому, что онкажется, это срабатывает. Это просто кажется неправильным, т. е. я не думаю, что мне следует явно устанавливать этот параметр, поскольку virtio_net
while e1000
работает из коробки. Я также обеспокоен потенциально высокой загрузкой процессора, если я буду использовать этот параметр.
Есть ли у кого-нибудь идеи, что за этим может стоять и что я могу попробовать?