首页/云/云平台与虚拟化速查/virtio 网卡多队列配置
虚拟化操作94 条

virtio 网卡多队列配置

多队列让网卡在不同 vCPU 上并行收发,提升高 PPS 场景吞吐;域 XML 声明 queues 后,还需要在 guest 内用 ethtool 打开队列数。

云平台与虚拟化速查云更新于 2026-10-13

多队列网卡是什么

virtio-net 多队列让虚机网卡使用多个收发队列,不同队列的中断可以落到不同 vCPU 上处理,从而缓解单队列在高速网络下的瓶颈。配置分两处:域定义里用 queues 指定队列数,guest 内用 ethtool 设置 combined 队列数,两边都配上才能生效。

基本信息

域定义<driver name='vhost' queues='4'/>
guest 侧ethtool -L eth0 combined 4
查看方式ethtool -l eth0 / virsh dumpxml 查 queues
前提vCPU 数量与队列数匹配、网卡类型为 virtio
生效时机修改 queues 需要在关机状态调整后重启虚机

典型使用场景

  • 虚机承担高吞吐网络服务(网关、代理、负载均衡)
  • 多 vCPU 虚机网络中断集中在一个核上,软中断占用偏高
  • 抓包或压测时发现单队列成为吞吐瓶颈
  • 迁移到高速内网规格后需要重新评估队列数

guest 内查看与设置

guest 内查看与设置
ethtool -l eth0                  # 当前队列数与可设置上限
sudo ethtool -L eth0 combined 4  # 设为 4 个 combined 队列
ethtool -S eth0 | head           # 查看各队列统计
nproc                            # 与 vCPU 数对比,队列数不宜远超 vCPU
cat /proc/interrupts | grep virtio   # 确认中断是否分散到多个 CPU

检查点与期望

检查点查看方式期望表现
域定义队列数virsh dumpxml 看 driver 中的 queues与 guest 内设置的队列数一致
guest 队列数ethtool -l eth0combined 等于目标队列数
vCPU 数量nproc队列数不超过 vCPU 数通常更划算
中断分布/proc/interrupts 中的 virtio 行中断分散在多个 CPU,而非集中在 0 号
网卡类型virsh dumpxml 中 model必须为 virtio,e1000 等不支持多队列
队列数不超过 vCPU 数通常更划算,超过后中断处理与调度开销上升,收益递减甚至反转。
使用 vhost-net 内核加速时,队列由宿主侧内核线程处理,队列数要与宿主 CPU 资源匹配;队列过多会让宿主软中断成为瓶颈。
多队列不是万能提速手段:虚机间大流量通信或单连接场景下,瓶颈可能在协议栈或接收端窗口,先确认瓶颈位置再调队列数,避免无效改动。

配置步骤

  • 关机虚机:修改 queues 属性需要停机,运行状态下改动不会生效
  • 编辑域定义,把网卡 driver 改为 vhost 并设置 queues 值为目标队列数
  • 启动虚机后进入 guest,用 ethtool -l 查看可设置上限
  • 用 ethtool -L 设置 combined 队列数与域定义一致
  • 用 /proc/interrupts 确认中断已分散到多个 CPU,再压测对比吞吐

易错点

  • 只改 XML 未在 guest 启用:队列数仍为 1,性能无变化
  • 在运行状态修改 queues 属性,改动不生效或需要重启虚机
  • 网卡不是 virtio 却按多队列方案配置,ethtool 看不到 combined 选项
  • 队列数远超 vCPU 数,中断处理开销反噬吞吐

数据来源与参考

  • libvirt 文档:interface driver queues
  • Red Hat 虚拟化:多队列 virtio
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌