多队列网卡是什么
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 eth0 | combined 等于目标队列数 |
| 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,再压测对比吞吐