virtio-win项目中Windows虚拟机网络性能问题的分析与解决
问题背景
virtio-win项目为KVM虚拟化环境中的Windows客户机提供半虚拟化设备驱动程序。近期用户报告在使用virtio-net网络驱动时,Windows虚拟机的网络传输性能出现严重问题,特别是在启用LSO(Large Send Offload)和TSO(TCP Segment Offload)功能时。
问题现象
用户观察到以下典型性能问题:
-
发送方向(TX)性能问题:当Windows虚拟机作为发送方时,启用LSO会导致传输速度从约2Gbps骤降至1Mbps左右。禁用LSO后性能可恢复正常。
-
接收方向(RX)性能问题:当Windows虚拟机作为接收方时,如果发送方(如Linux或FreeBSD虚拟机)启用了TSO,接收速度会降至15Mbps(来自Linux)或100Kbps(来自FreeBSD)。禁用发送方的TSO后,Windows接收性能可提升至3Gbps。
技术分析
性能对比数据
通过iperf3测试工具,用户收集了详细的性能对比数据:
| 发送方/接收方 | Fedora(主机) | Windows | TrueNAS(FreeBSD) | Ubuntu |
|---|---|---|---|---|
| Fedora | 23G/20G | 13G/2G* | 23G/17G | 22G/20G |
| Windows | 2G*/14G | 11G/12G | 3.5G/~0 | 4G*/20M |
| TrueNAS | 18G/26G | ~0/3.5G | 33G/31G | 16G/12G |
| Ubuntu | 21G/21G | 15M/4G* | 12G/15G | 20G/17G |
注:带号表示已应用LSO=off的临时解决方案
根本原因
经过社区调查,发现问题源于Linux内核6.10.3版本引入的一个网络协议栈bug。该bug影响了TCP分段卸载功能的正确处理,导致在特定网络配置下(特别是涉及虚拟网桥和virtio-net设备时)出现严重的性能下降。
解决方案
临时解决方案
在发现问题根源前,用户发现以下临时解决方案有效:
-
Windows端解决方案:
- 在Windows设备管理器中禁用"Large Send Offload"功能
- 这可以解决Windows作为发送方时的性能问题
-
Linux/FreeBSD端解决方案:
- 在发送方虚拟机或主机上执行
ethtool -K <interface> tso off - 这可以解决Windows作为接收方时的性能问题
- 在发送方虚拟机或主机上执行
永久解决方案
Linux内核6.10.5版本已修复此问题。用户升级到6.10.6内核后报告:
- Linux/FreeBSD到Windows的传输速度提升至7-11Gbps(相比TSO关闭时的3Gbps)
- Windows到Linux的传输速度提升至11-15Gbps(相比LSO关闭时的1-3Gbps)
技术细节
关于LSO和TSO
LSO(Large Send Offload)和TSO(TCP Segment Offload)是网络加速技术:
- LSO:允许网络协议栈将大数据包交给网卡处理分段
- TSO:允许网卡硬件执行TCP分段,减轻CPU负担
在虚拟化环境中,这些功能通过virtio-net驱动和主机网络栈协同工作,任何一方的实现问题都可能导致性能异常。
虚拟网络配置建议
对于高性能虚拟网络环境,建议:
- 保持内核版本最新,特别是涉及网络子系统时
- 监控virtio-net驱动的更新,及时升级客户机驱动
- 在性能测试时,同时检查有/无各种卸载功能的性能表现
- 考虑使用多队列virtio-net配置提高并行处理能力
结论
本次性能问题展示了虚拟化环境中网络协议栈的复杂性,特别是在涉及多层级卸载功能时。通过社区协作,问题被快速定位并解决。对于使用virtio-win项目的用户,建议:
- 升级到Linux内核6.10.5或更高版本
- 保持virtio-win驱动为最新版本
- 在性能关键场景下进行充分的网络性能测试
虚拟化网络性能优化是一个持续的过程,需要关注各组件(主机内核、虚拟化平台、客户机驱动)的协同工作状态。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



