PVE 踩坑笔记:VirtIO 网卡识别正常,测速跑不满,带宽上不去
一、故障表现
- 虚拟机网卡型号:VirtIO,系统内驱动正常,无报错
- 宿主机物理网卡、交换机协商到 10G/25G,交换机端口无错包、丢包
- 虚拟机之间、虚拟机对外连通正常,ping 无丢包
- iperf3 测速带宽远低于链路上限,CPU 占用不高,看不出明显瓶颈
- 换成 E1000 网卡测速会略有提升,但 E1000 本身性能差,不是正确方案
- 宿主机本身测速可以跑满带宽,说明宿主机物理网卡、上行链路正常
典型特征:物理链路带宽充足、驱动正常,但 VirtIO 转发性能被虚拟化侧参数限制。
二、原理简单说明
VirtIO 是半虚拟化网卡,性能远高于模拟网卡 E1000,但性能依赖几个关键点:virtio 队列数(mq 多队列)、宿主机网卡卸载特性(offload)、中断分配、缓冲区大小。 默认配置下 VirtIO 单队列,单 CPU 核心处理网卡收发,很容易出现单核心瓶颈,哪怕宿主机 CPU 整体空闲,也跑不满带宽。 同时宿主机网卡的 TX/RX 卸载、TSO/GSO 等特性和 VirtIO 配合不当,会造成大量小包开销、CPU 软中断升高,压制吞吐。
三、排查顺序
- 宿主机先确认物理网卡协商、错误包
# 替换成你的物理网卡名
ethtool eth0
ethtool -S eth0
重点看 rx_errors、tx_errors、rx_dropped、tx_dropped,有持续增长就是链路或网卡层面问题。
- 宿主机查看软中断,确认是否集中在单个 CPU 核心
watch -n1 cat /proc/interrupts
Virtio 相关的中断如果全部集中在同一个核,就是典型单队列瓶颈。
- 进入虚拟机内查看 virtio 网卡是否开启多队列
# Linux虚拟机
lspci | grep Virtio
ls -l /sys/class/net/eth0/queues/
目录下只有 rx-0 tx-0,代表只有单队列,没有开启 mq。
- 虚拟机内查看网卡卸载特性
ethtool -k eth0
- iperf3 测速复现,同时观察宿主机 CPU 和 softirq
apt install iperf3
# 服务端
iperf3 -s
# 客户端
iperf3 -c 目标IP
四、分场景修复方案
场景 1:VirtIO 未开启多队列(virtio mq,最高发)
VirtIO 默认单队列,收发只能交给一个 CPU 核心处理,带宽上限被单核性能锁死。
需要先关闭虚拟机,修改网卡配置
PVE 网卡配置: 网卡 → 高级 → 勾选【多队列(MQ)】,队列数量建议和虚拟机 CPU 核心数匹配(不超过 vCPU 数量)。 比如虚拟机给 4 核,队列设置 4。
修改完成开机,虚拟机内验证队列:
ls /sys/class/net/eth0/queues/
出现 rx-0~rx-3、tx-0~tx-3 代表多队列生效。
Windows 虚拟机:开启 MQ 之后需要确认 virtio 驱动版本,老版本 virtio-win 对 mq 支持差,建议升级到稳定新版 virtio-win 驱动。
场景 2:宿主机网卡 offload 特性冲突
部分万兆网卡,TSO、GSO、TX 卸载开启后,和 VirtIO 叠加,出现分段异常,小包场景性能反而下降。 可以临时关闭卸载测试:
ethtool -K eth0 tso off gso off gro off
注意:这只是临时测试,不要直接长期关闭所有 offload,会增加宿主机 CPU 开销;找到冲突点针对性调整。
场景 3:虚拟机网卡缓冲区过小
RX/TX 缓冲区不足,高吞吐时丢包限速。 查看缓冲区:
ethtool -g eth0
调整缓冲区大小(按需):
ethtool -G eth0 rx 4096 tx 4096
该配置重启虚拟机失效,可以写入开机脚本持久化。
场景 4:虚拟机 vCPU 绑定不合理,中断落在同一个核心
即使开启了 virtio mq,如果虚拟机 vCPU 都调度在宿主机同一个物理核心,多队列也无法发挥作用。 生产高吞吐虚拟机,可以开启 CPU pin(CPU 绑定),把 vCPU 分散到不同物理核,避免跨 NUMA 调度。
NUMA 节点跨节点访问延迟高,万兆 / 25G 高吞吐业务优先同 NUMA 分配。
场景 5:QEMU 的 IOThread 没有配置
高吞吐业务,可以给网卡绑定 iothread,把网卡收发处理从主线程剥离。 操作:VM 选项启用 iothread,网卡硬件勾选 “使用 IOThread”。适合大流量转发、网关类虚拟机。
场景 6:VirtIO 驱动版本老旧
Windows 虚拟机最常见:系统自带通用 virtio 驱动版本过低,存在性能 bug。 解决:挂载 virtio-win ISO,更新网卡驱动。 Linux 虚拟机尽量使用发行版自带较新内核,低版本内核 virtio 存在性能缺陷。
五、验证修复
调整后重新 iperf3 测速:
iperf3 -c x.x.x.x -P4
带宽可以跑满预期值,宿主机软中断均匀分布在多个 CPU 核心,无持续丢包即修复完成。
六、高频踩坑点
- 点赞
- 收藏
- 关注作者
评论(0)