我正在将应用程序从 Win2k16 服务器迁移出去,但似乎 Win 服务器不同意该计划。
在迁移数据时,我意识到性能非常糟糕,只有 5-7 MBit/s,而它应该是该值的 10 倍。
为了进行更多调查,我从测量 SMB 性能切换到使用,iperf3
这样我就可以重现问题。我在网络和调试网络问题方面有很多经验,但这是那些似乎不符合逻辑的场景之一。换句话说,我陷入了困境,不知道发生了什么,也不知道如何解决这个问题。
因此,我正在寻找任何有助于调试、确定和解决问题的想法。
以下图片显示了该问题:
app
托管提供商端的虚拟机 ( ) 连接到win
办公室中的 Hyper-V 主机 ( )时性能不佳(2)
,而托管提供商主机 ( host
) 本身工作正常。此外,虚拟机连接到办公室主机上的(5)
Hyper-V 虚拟机 ( ) 时性能尚可。
git
(1)
设置:
- 现有分公司:
gw
连接到互联网和本地局域网的系统;wireguard VPN 客户端win
本地 LAN 的一部分,也运行 HyperV- 2 个物理 LAN 适配器,与 NIC 组合(HyperV 端口平衡)相结合
- 外部 Hyper-V 交换机设置为与主机操作系统共享
win
IP 地址设置在来自此主机操作系统共享的虚拟适配器上git
HyperV VM,也是同一 Hyper-V 交换机 LAN 的一部分
- 两者
win
都git
没有任何特殊路由,并使用gw
其作为默认网关。
- 托管提供商:
host
运行 Linux libvirtd/KVM;wireguard VPN 服务器app
Linux 虚拟机
- 联网:
- 分支机构局域网:1Gbit/s
- 分支机构互联网:1000 下载 / 100 下载
- 托管提供商互联网:1000 次下载 / 1000 次上传
Internet <--> Internet
测量速度约为:900/90 MBit/sVPN <--> Internet <--> Internet <--> VPN
测量速度约为:800/80 MBit/s
- IP 网络:
192.168.34.0/24
办公室局域网172.16.48.0/30
wireguard VPN 隧道192.168.46.0/30
托管提供商的 VM 网络
- L2 网络:
gw
具有中继链路(静态)和 VLAN 标记,用于互联网访问gw
具有中继链路(静态)和 VLAN 标记,用于办公室 LAN 访问win
具有中继链路(静态),办公室 LAN 未加标签- 托管提供商端没有 VLAN 或中继链路。主机有 1 个物理适配器,可访问互联网
- 为了确保不存在碎片问题,
host
vpn隧道接口和app
虚拟适配器上的MTU都设置为1400。
以下是我迄今为止的推理和测试:
由于速度测试(1)
和(3)
工作均按预期进行,因此网络没有固有/一般问题,即 Linux 软件桥、wireguard VPN 隧道(其本身速度不快,但速度恒定)没有问题。
由于速度测试(5)
按预期运行,因此网络访问不存在固有/一般问题win
。这与用户未报告应用程序运行时存在任何问题的情况一致。
从侧面看,除了IP子网不同之外,连接之间win
没有太大的区别。host
app
由于唯一的区别似乎在于 IP 子网,我认为交换机上的某些 MAC/IP/端口哈希可能导致中继链路出现问题。因此,我断开了所有中继链路,只留下一条物理链路。行为没有变化。
此外,由于win
具有板载 Broadcom 适配器,并且有有关 Hyper-V/Broadcom 问题的报告 wrt 虚拟机队列,我禁用了Virtual Machine Queues
所有我能找到设置的适配器上的功能(并重新启动系统)。
为了进一步排除与 VM 的 IP 子网的任何关系,我在托管提供商端的另一个子网中使用另一个 VM 进行了测试,但没有成功,最后从路由切换到 NAT,但仍然没有成功。
此时,win
系统会发现所有测试都来自同一 IP 地址,但根据实际来源,其行为仍然有所不同。这可能表明app
虚拟机与host
系统的 TCP 堆栈存在一些问题/差异,但两个系统都运行完全相同的操作系统,并且处于相同的补丁级别(Oracle Linux 8.3
基本上是 RHEL8 5.4.17-2036.104.4.el8uek.x86_64
)。
作为最后的测试,我在app
和之间进行了 SSH 本地端口转发,即通过端口转发host
连接到并获得了所需的速度。这是预期的,因为现在实际连接再次来自。win
host
host
最后,如在的本地 LAN 端所见gw
,一些图表(蓝色为Bytes Out
,绿色为Rcv Win
):
TCP 窗口大小win --> host
TCP 窗口大小win --> app
我不确定这是否说明了很多问题,除了 10 倍的性能差异在窗口大小上也很明显。3 秒后也出现了奇怪的扩展,但吞吐量没有任何变化。
TCP 往返时间 (RTT)win --> host
TCP 往返时间 (RTT)win --> app
请注意最后一张图中两个方向的峰值。这是否表示某些缓冲区(交换机、Hyper-V、本地网络堆栈等)已满?但话又说回来,为什么在进行测试时一切都正常git --> app
?此外,ping
使用各种不同大小和目标(win
、、)进行git
的测试没有显示任何差异(RTT 始终在 20ms 左右)。gw
app
因此,我们再次热烈欢迎任何关于可以做什么/进一步测试的想法!