Windows/Hyper-V 与远程 Linux VM 之间的网络性能问题

Windows/Hyper-V 与远程 Linux VM 之间的网络性能问题

我正在将应用程序从 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 交换机设置为与主机操作系统共享
      • winIP 地址设置在来自此主机操作系统共享的虚拟适配器上
      • gitHyperV VM,也是同一 Hyper-V 交换机 LAN 的一部分
    • 两者wingit没有任何特殊路由,并使用gw其作为默认网关。
  • 托管提供商:
    • host运行 Linux libvirtd/KVM;wireguard VPN 服务器
      • appLinux 虚拟机
  • 联网:
    • 分支机构局域网:1Gbit/s
    • 分支机构互联网:1000 下载 / 100 下载
    • 托管提供商互联网:1000 次下载 / 1000 次上传
    • Internet <--> Internet测量速度约为:900/90 MBit/s
    • VPN <--> Internet <--> Internet <--> VPN测量速度约为:800/80 MBit/s
  • IP 网络:
    • 192.168.34.0/24办公室局域网
    • 172.16.48.0/30wireguard VPN 隧道
    • 192.168.46.0/30托管提供商的 VM 网络
  • L2 网络:
    • gw具有中继链路(静态)和 VLAN 标记,用于互联网访问
    • gw具有中继链路(静态)和 VLAN 标记,用于办公室 LAN 访问
    • win具有中继链路(静态),办公室 LAN 未加标签
    • 托管提供商端没有 VLAN 或中继链路。主机有 1 个物理适配器,可访问互联网
    • 为了确保不存在碎片问题,hostvpn隧道接口和app虚拟适配器上的MTU都设置为1400。

以下是我迄今为止的推理和测试:

由于速度测试(1)(3)工作均按预期进行,因此网络没有固有/一般问题,即 Linux 软件桥、wireguard VPN 隧道(其本身速度不快,但速度恒定)没有问题。

由于速度测试(5)按预期运行,因此网络访问不存在固有/一般问题win。这与用户未报告应用程序运行时存在任何问题的情况一致。

从侧面看,除了IP子网不同之外,连接之间win没有太大的区别。hostapp

由于唯一的区别似乎在于 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连接到并获得了所需的速度。这是预期的,因为现在实际连接再次来自。winhosthost

最后,如在的本地 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 左右)。gwapp

因此,我们再次热烈欢迎任何关于可以做什么/进一步测试的想法!

相关内容