我在主机和客户机上运行 KVM/QEMU 7.2.0 和 Linux(x86_64 上的内核 6.1.6)。对于虚拟网络,我在主机上使用桥接设备,客户机将其 NIC 作为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 MB/s,相比之下,将驱动程序切换为e1000e
~400 MB/s。
通过反复试验,我发现如果我在客户虚拟机中设置模块napi_weight=1
参数virtio_net
,性能就会恢复正常。
在阅读了有关 NAPI 的内容后,我了解到该napi_weight
参数用于在基于中断和基于轮询的接收数据包服务之间切换。通常,该参数默认为NAPI_POLL_WEIGHT
常数,即 64。我无法理解问题的根本原因,我不想仅仅因为它而设置此参数似乎奏效了。感觉不对劲,也就是说,我认为我不应该明确设置这个参数,因为virtio_net
whilee1000
开箱即用。我还担心如果我要使用此参数,可能会出现 CPU 使用率过高的情况。
有人知道这背后可能是什么原因以及我可以尝试什么吗?