KVM虚拟机网卡多队列virtio‑net‑queues提升

KVM虚拟机默认使用单队列virtio网卡时,所有收发中断都落在同一个CPU核心上,高并发场景下容易形成瓶颈。
通过开启virtio-net-queues多队列,可以让虚拟机网卡的多个队列分别绑定不同vCPU,把网络中断和处理压力分散到多个核心,直接改善吞吐量和延迟波动。
本文按实际生产环境经验,讲清楚从宿主机检查到XML配置、再到验证效果的全过程,零基础也能照着做。

先搞懂多队列解决的是什么问题

virtio-net-queues的“队列”指的是虚拟网卡的收发队列。
传统单队列模式下,一个队列对应一个中断,宿主机和虚拟机只能用一个CPU核心处理这个网卡的所有收发请求。
当虚拟机网络流量很大时,这个核心会持续跑满,其他核心空闲,整体网络性能被锁死。

开启多队列后,网卡会创建N个发送和接收队列,每个队列可以绑定到不同的vCPU。
这样,外部流量进入虚拟机时,宿主机和客户机可以把不同队列的中断分散到多个核心并行处理。
简单说,就是让多个CPU一起扛网络收发的活,而不是一个核心累死。

开启前的宿主机和虚拟机检查项

不要直接改配置,先确认环境满足这些条件,否则就算开了也不生效,甚至会起不来。

  • 宿主机CPU核数足够,建议至少4核,且BIOS和操作系统已开启CPU虚拟化(VT-x/AMD-V)。
  • KVM相关模块正常加载,执行lsmod | grep kvm能看到kvm_intelkvm_amd
  • 虚拟机网卡驱动必须是virtio类型,不能用e1000或rtl8139。检查方法:在虚拟机内执行ethtool -i eth0,确认driver是virtio_net
  • 客户机操作系统需支持多队列,主流Linux发行版和Windows Server 2012以上都支持,但Windows需要安装对应的virtio驱动版本。

一个容易忽略的匹配规则:队列个数不能超过虚拟机的vCPU数量
例如4核虚拟机最多配置4个队列,通常建议队列数和vCPU数保持一致,比如8核配8队列,最多不超过16个队列,因为队列过多反而增加调度开销。

用virsh修改网卡XML配置多队列

过程分为编辑配置、应用配置和确认结果三步。
以下以vm01虚拟机为例,实际操作时换成你的虚拟机名称。

第一步,导出虚拟机配置文件,准备修改。
在宿主机执行:

virsh dumpxml vm01 > /tmp/vm01.xml

第二步,编辑/tmp/vm01.xml,找到这一节,里面已经存在的就是virtio网卡。
后面,添加一行多队列参数:

完整片段类似:


  
  
  
  

这里的queues='4'就是网卡队列数,必须为偶数,因为发送和接收队列各占一半。
4核虚拟机就写4,8核写8。
如果虚拟机有多块网卡,也可以只给需要高吞吐的网卡加这个参数。

第三步,关闭虚拟机后再用修改后的配置启动。
因为当前运行的虚拟机不会直接热加载新队列参数,需要干净重启:

virsh destroy vm01
virsh define /tmp/vm01.xml
virsh start vm01

注意,如果你用的管理工具是virt-manager或OpenStack,也可以在图形界面或Flavor Extra Specs里配置网卡队列,但底层生成的XML参数是一样的。

验证多队列是否真正生效

启动虚拟机后,登录到虚拟机内部验证。
注意,这里要确认的是客户机系统里是否能看到多个队列,而不是只看宿主机XML。

查看队列数量

在虚拟机内执行:

ethtool -l eth0

如果输出里有如下内容,说明多队列已生效:

Combined: 4

如果Combined显示为1或只有Current没有Max,说明参数没生效,继续检查前面的步骤。

查看中断分布

检查中断是否分散到不同CPU,执行cat /proc/interrupts,找到virtio-input和virtio-output对应的中断号,看它们是否分散到多个CPU。
你也可以用mpstat -P ALL 1观察网络流量高的时刻不同CPU利用率是否都有上升,如果只有一两个核心忙,说明队列没有真正分散。

常见坑和性能对比建议

队列数和vCPU不是越多越好。 如果vCPU只有2,却写了4个队列,多余的队列只会增加上下文切换,性能反而下降。
最好的做法是先给虚拟机分配4-8个vCPU,再配置相同数量的队列。

Windows虚拟机注意驱动版本。 老版本virtio-win驱动不支持多队列,建议从Fedora官方仓库或云厂商镜像站下载最新virtio-win驱动,安装后重启再检查。
打开设备管理器,在网络适配器的高级属性里,应该能看到Receive Buffers等调整项,说明驱动版本较新。

不要用hostdev直通模式改队列。 这里说的是virtio虚拟网卡,如果你是CPU直通或SR-IOV网卡,队列由硬件管理,不能用本文的XML参数。

实测效果怎么判断? 开启多队列前后,可以用iperf3netserver做局域网TCP吞吐测试。
在宿主机和虚拟机各装一个iperf3,跑10秒双向测试,通常4队列相比单队列能提升30%-80%的吞吐,同时延迟抖动明显降低。
若你的业务本来流量很小,可能感知不强,但高并发Web、视频转发、大数据传输这类场景改善非常明显。

如果你只想给某块网卡开多队列,记得在XML里只修改对应网卡,不要动其他设备;
生产环境变更前建议先打快照或备份原XML,方便回滚。
多队列是KVM虚拟机网络性能优化里性价比很高的一项调整,先确认vCPU和驱动,再改XML重启,最后用ethtool -l验证,整个过程十几分钟就能完成。
遇到重启后不生效的情况,优先检查宿主机内核是否支持vhost模块,执行modprobe vhost_net加载后再试。
按照这套流程操作,你的虚拟机网络吞吐基本都能看到明显提升。

分享到:
上一篇
Nginx gzip压缩调优,文本、json
下一篇
Linux KVM Zapscape虚拟机逃逸漏洞检测脚本
1
系统公告

机房迁移升级通知

尊敬的用户: IP 段 103.23.148.x、156.224.29.x 原香港一区线路波动、攻击频繁,平台定于 7 月 5 日凌晨分批迁移至香港 GIA 机房,硬件升级 AMD 铂金机型。 迁移均在凌晨操作,最大程度降低业务影响,迁移期间服务器临时关机; 升级后配置不降低、费用不涨价,数据默认同步迁移; 迁移后 IP 全部更换,请及时修改域名解析、防火墙白名单; 建议提前备份重要数据,有问题可联系在线客服。 感谢理解与支持! 泽御云科技 2026.06.30
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意