通过 VirtualSwitch vEthernet NAT 接口路由的 HyperV 连接中的网络性能非常差

通过 VirtualSwitch vEthernet NAT 接口路由的 HyperV 连接中的网络性能非常差

我的主机(装有 Win10 的笔记本电脑)具有良好的 wifi 连接,速度达到 MB/s。另一方面,VM 客户机有时会停滞在 5 KB/s 范围内。我如何提高客户机互联网流量的性能?

  • 客户机:HyperV 内的 ubuntu 16.04 LTS 客户机 VM。Internet 网关连接到使用 powershell 创建的 VNAT 链接。
  • 主机:Win10 pro v1803(内部版本 17134.345)。通过物理 wifi 卡访问互联网。在家庭网络上。

网络配置

客户机确实可以通过主机上的虚拟以太网适配器 NAT 连接到互联网,但互联网 TCP 连接速度非常慢(<5KB/s)。主机本身使用 wifi,通常可实现 MB/s 的连接速度。

VM 位于两个不同的 IPV4 网络上。我没有配置 IPv6,而且它是唯一运行的 VM。

  1. 客户 eth0 已打开192.168.20.200/24。此网络用于 Windows 主机和 VM 之间的本地流量。该链路上的最大带宽很高,符合预期。主机的延迟小于 1ms。因此,这里没有问题。在 HyperV 中,此接口与主机的 VSwitch 相连。

  2. 客户机 eth1 已打开,192.168.30.200/24可用于访问互联网。在 HyperV 中,该接口连接到 NAT VSwitch,并为虚拟机提供互联网连接。从虚拟机的角度来看,该链路上的带宽非常慢,即持续下载速度约为 5 KByte/s。另一方面,延迟与主机的延迟相似,互联网 ping 的延迟在 8-9ms 范围内。

主机上的 VNat 是使用 powershell 创建的,使用的步骤如下在这篇 Microsoft 文章中

尝试禁用卸载功能——没有效果

我已禁用客户机上的卸载功能,以查看是否能增加最大带宽,使用以下命令:

for i in rx tx sg tso ufo gso gro lro rxvlan txvlan rxhash; do
    sudo ethtool --offload eth1 "$i" off
done

但它并没有提高客人的互联网速度。我没有注意到任何效果。

尝试过主机重启/重新启用 VNAT 接口——没有效果

我尝试重新启动主机和虚拟机,禁用并重新启用 NAT 接口,但这也没有明显改善任何情况。

其他详情:

  • 在 powershell 中,Get-NetAdapter 报告 vSwitch 的以下基本信息:

      vEthernet (vNAT)          Hyper-V Virtual Ethernet Adapter #6          19 Up           00-15-5D-02-E8-0F        10 Gbps
    
  • TCP 连接将很快降至 5KB/s 以下。Apt-get 可能会在小软件包上停留数小时:

      0% [3 InRelease 104 kB/109 kB 95%]                               2,889 B/s
      ...
      Fetched 323 kB in 1min 1s (5,280 B/s)
    
  • 在家里,家里客人的 speedtest-cli 报告下载速度为 1.91Mbps,上传速度为 13.02Mbps。在主机上,下载速度为 80Mbps,上传速度为 20Mbps。

  • 在大学里,客户机上的 speedtest-cli 报告下载速度为 5.9Mbps,上传速度为 8.41Mbps。在主机上,下载速度为 112.53 Mbps,上传速度为 154.13 mbps。

  • 客户内核是 Ubuntu 16.04 (xenial) Linux host 4.4.0-138-generic #164-Ubuntu SMP Tue Oct 2 17:16:02 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux。如果我相信这一点的话,这个内核似乎内置了 hyperv 驱动程序列表

答案1

我找到了导致速度变慢的合理原因。我认为这与虚拟内存不足有关。——主机是一个内存受限的环境(笔记本电脑)。

我注意到,当我遇到这些低速问题时,在任务管理器中,进程Vmmem处于麻木状态,消耗了很大一部分可用虚拟内存(~GBs),并且 CPU 使用率相对较高。我怀疑网络缓冲区陷入了这种混乱,它们被换出,或者只是被丢弃,因为它们无法在内存中的任何位置排队。

我不太确定在 Vmmem 开始出现故障后修复其状态的最佳方法是什么。我尝试通过关闭主机和虚拟机中的所有应用程序来释放内存。还尝试关闭所有虚拟机,但它会继续旋转。就像我在问题中提到的那样,我也尝试过主机重新启动,但通常 win10 主机重新启动会使虚拟机保持运行,因此大概坏状态也会在主机重新启动时再次出现。

我的解决方法

解决此问题的一种方法似乎是软关闭 Hyper-V 中的虚拟机,重新启动主机,然后重新启动虚拟机。这可能无法解决根本原因(交换空间不足?Hyperv 中分配的内存不足?),但至少它可以恢复虚拟机中的良好网络速度。

我在问题中发布的这些网络速度完全不符。我当然不会期望我的非对称家庭互联网连接上的 RX 低于 TX。

相关内容