前情
用 iperf3 测试云主机不同系统之间能跑多少带宽。
怪现象
- 两台 Windows Server 2012 R2 测试,带宽只能到 2.4Gbps;
- 两台 CentOS 6.8 测试,可以达到 4Gbps,不限制带宽的环境下可以到 16Gbps;
- CentOS 做 Client,Windows 做 Server,也只能跑到 2.4Gbps。
排查过程
1. 怀疑虚拟机不在同一台物理机上
把测试用的虚拟机都迁移到一台物理机上,测试结果依然是 Linix 完胜 Windows Server。
2. 怀疑系统的 TCP wscale 值差异
抓包发现 iperf3 Windows 版用的 wscale 是 2,CentOS 版经过系统级的 TCP 参数调优后是 7,所以把目标放在调高 Windows 的 wscale。
netsh interface tcp set supplemental template=datacenter
netsh interface tcp set global autotuninglevel=experimental
结果发现,这样设置后,带宽确实提高到 3.5Gbps,但 wscale 并没有变化。
3. 怀疑 iperf3 Windows 版有毛病
因为上面的 2 条命令可以增加其它应用的 wscale 到 7,但 iperf3 不受影响,所以怀疑它有毛病。看了代码后,发现 Client 端用 -w 参数就可以让 Server 的 SO_RCVBUF 也使用 Client 设置的值,然后加上 -w 16000000 和 -w 32000000 分别测试,发现带宽还是无法提高,甚至有点下降。
但到这里,我们可以得出结论:Windows 机器之间带宽上不去,并非因为 wscale 小。
4. 怀疑是虚拟机服务器和客户机系统驱动之间有关联
云主机是虚拟机,它跑在 Linux 的物理机上,有可能一脉相承的 Linux 的驱动设计得比较好,所以 Linux 的虚拟机网络性能更高。
带着这个怀疑,稣在 Hype-V Server 上开了两个 Ubuntu 上测试,并优化了 TCP 参数:
echo "88584 118114 177168" | sudo tee /proc/sys/net/ipv4/tcp_mem
结果也才 2-3Gbps 左右……不玩了。总之,物理机什么系统,客户机最好也是一样的,毕竟有血缘关系。