Ich verwende KVM/QEMU 7.2.0 mit Linux sowohl für Host als auch für Gast (Kernel 6.1.6 auf x86_64). Für das virtuelle Netzwerk verwende ich ein Bridge-Gerät auf dem Host, an das der Gast seine Netzwerkkarte als tap
Gerät anschließt:
-netdev {"type":"tap","vhost":true,"id":"hostnet0"}
-device {"driver":"virtio-net-pci","netdev":"hostnet0","id":"net0"}
virtio-net-pci
In Bezug auf QEMU sollte die virtuelle Gastnetzwerkschnittstelle die beste Leistung bieten. Allerdings virtio-net-pci
erreicht sie im Gast nur eine Empfangsgeschwindigkeit von ca. 0,3 MB/s, während e1000e
mir zum Vergleich das Umschalten des Treibers auf ca. 400 MB/s liefert.
Durch Ausprobieren habe ich herausgefunden, dass die Leistung wieder normal wird, wenn ich napi_weight=1
die Parameter für das Modul in der Gast-VM einstelle.virtio_net
Nachdem ich über NAPI gelesen habe, habe ich verstanden, dass dieser napi_weight
Parameter verwendet wird, um zwischen der unterbrechungsbasierten und der pollingbasierten Bearbeitung empfangener Pakete umzuschalten. Normalerweise ist der Parameter standardmäßig auf NAPI_POLL_WEIGHT
konstant 64 eingestellt. Ich kann die Grundursache des Problems nicht verstehen und möchte diesen Parameter nicht nur deshalb einstellen, weil erscheint zu funktionieren. Es fühlt sich einfach falsch an, d. h. ich glaube nicht, dass ich diesen Parameter explizit festlegen sollte, solange er virtio_net
sofort e1000
funktioniert. Ich mache mir auch Sorgen über eine potenziell hohe CPU-Auslastung, wenn ich diesen Parameter verwenden würde.
Hat jemand eine Idee, was dahinter stecken könnte und was ich versuchen könnte?