我们遇到的问题是,通过 Wireguard Tunnel 从多个客户端网络到服务器上的 Samba 共享的连接速度很慢,但奇怪的是,它只影响 Windows 10 并且只影响上传。
Linux 主机的上传速度最高可达 120MB/s,而 Windows 的上传速度仅为 10-50MB/s(根据我们拥有的不同网络而有所不同)。它不限于 smb,我使用 Iperf(udp 和 tcp)获得了完全相同的测试结果。
出于好奇,我测试了 Windows 11 是否也受到影响,结果是不是!这可能是什么?我该如何解决?
答案1
他们在 0.4.8 版本中添加的实验性内核驱动程序破坏了 Windows 的上传速度。只需运行旧版本,直到他们修复它。
https://download.wireguard.com/windows-client/wireguard-amd64-0.4.7.msi
答案2
这似乎与 Dropbox 描述的问题相同或至少类似(https://dropbox.tech/infrastructure/boosting-dropbox-upload-speed据我所知(请纠正我!)当 Linux 网关使用 Wireguard 的 NIC 多队列时,会发生大量程序包重新排序,而 Windows 10 显然无法很好地处理这种情况。程序包重新排序不知何故导致 Windows 10 通过在几乎每个发送的数据包后等待确认而不是发送多个数据包并接受选择性确认来降低发送速度。
遗憾的是,我忘记对我分析的 Wireshark 会话进行截图,但可以清楚地看到,在下载时,Windows 主机通常会收到大约 10-20 个 TCP 数据包,然后才会发送确认。但在上传时,我收到每个发送的数据包的 TCP 确认。
解决此问题的方法是禁用 Linux 主机上的多队列。
ethtool -L PHYSICAL_LOCAL_INTERFACE combined 1
ethtool -L PHYSICAL_NETWORK_INTERFACE combined 1
要查看它是否被应用,可以使用
ethtool -l INTERFACENAME
Channel parameters for INTERFACENAME:
Pre-set maximums:
RX: 0
TX: 0
Other: 1
Combined: 63
Current hardware settings:
RX: 0
TX: 0
Other: 1
Combined: 1
最后一行应该是 1。上面的命令只是临时设置它,要使它持久,需要使用特定于发行版的工具。对于 Debian,它可能如下所示:
cat /etc/network/interfaces
auto INTERFACE
iface INTERFACE inet static
address IPADDR
netmask NETMASK
gateway GATEWAY
# This is the relevant line
post-up ethtool -L INTERFACE combined 1
如果网关没有强大的 CPU,这可能会造成瓶颈。我们使用 AMD EPYC 7262 8 核处理器,并以一个核心约 70% 的使用率获得完整的 1Gbit 上传和下载。