Hyper-V VM 上的网络性能不佳

有几次我遇到过这样一种情况,即从运行Windows Server 的Hyper-V主机上的虚拟机复制文件的速度要慢得多。在本文中,我尝试描述几种不同的方法来提高在Windows Server (以及最新的Windows 10和11版本)上运行的Hyper-V虚拟机的网络性能。

在 Hyper-V vSwitch 中接收分段合并 (RSC)

首先,您应该注意 Windows Server 2019/2022(和 Windows 10 1809+)上的 Hyper-V 中出现的接收段合并 (RSC) 功能。接收分段合并在虚拟交换机级别 (vSwitch) 使用。

RSC 允许通过将多个 TCP 段组合成更大的段来减少 CPU 负载并提高网络吞吐量。 网络性能得到提高,因为大型分段的处理速度比许多较小的分段更快。

在以前的 Hyper-V 版本 (Windows Server 2016/2012R2) 中,NIC 级别仅支持硬件接收段合并模式。

如果启用了 RSC 支持,则可能会导致某些硬件配置中出现额外的网络延迟。

默认情况下, Windows Server 2019 上的所有外部交换机启用 RSC。

您可以使用以下命令检查是否为虚拟交换机启用了 RSC:

Get-VMSwitch | Select-Object *RSC*

可以使用以下命令禁用对客户端网络适配器上的 IPv4 流量使用 RSC:

Disable-NetAdapterRsc -Name "Ethernet" -IPv4

检查禁用 RSC 后 Hyper-V VM 中的复制速度是否提高。如果网络速度有所提高,则可以在 VM 连接到的虚拟交换机上禁用 RSC。

您可以使用 iperf 工具检查网络吞吐量。

要禁用特定虚拟交换机的软件 RSC,请运行以下命令:

Set-VMSwitch -Name vSwitchName -EnableSoftwareRsc $false

check if RSC is enable on hyper-v switch

您可以即时启用/禁用RSC,它不会影响任何活动连接。

或者,您可以在Windows主机上完全禁用RSC:

netsh int tcp set global rsc=disabled

网络适配器驱动程序中的虚拟机队列 (VMQ) 模式

在某些情况下,如果在物理 Hyper-V 主机的网络适配器驱动程序中启用了 VMQ(虚拟机队列),则可能会导致 Hyper-V 虚拟机中的网络性能不佳。

VMQ 是一项硬件功能,如果您的硬件不支持它在驱动程序中启用,则可能会导致数据包丢失和网络延迟增加。

该问题是 Broadcom 千兆网络适配器的典型问题,在所有 Hyper-V 版本 (Windows Server 2012 R2/2016/2019) 中都会出现。

VMQ 旨在通过将数据包从物理网络适配器直接转发到虚拟机来提高网络性能。

可以在网络适配器驱动程序的属性中禁用 VMQ。

disable VMQ (Virtual Machine Queue) in NIC driver settings

或者,可以使用 PowerShell 显示支持 VMQ 的网络适配器列表及其状态:

Get-NetAdapterVmq

要禁用特定网卡的 VMQ,请运行以下命令(网络适配器将在几秒钟内不可用):

Set-NetAdapterVmq -Name “NICName” -Enabled $False

check if vmq is enabled in NIC - powershell

禁用 VMQ 后,最好重新启动主机并检查网络性能。

确保在 Windows 中禁用 
QoS 带宽限制策略。

在Windows Server 2019上优化Hyper-V的TCP设置

将当前的TCP设置保存在Hyper-V主机上,并应用新设置,这些设置将使Windows Server 2019中的TCP设置几乎与Windows Server 2016中的TCP设置相似。

保存当前设置:

​
Get-NetTCPSetting -SettingName Datacenter,DatacenterCustom,InternetCustom,Internet|select SettingName,CongestionProvider,CwndRestart,ForceWS|Export-csv c:\backup\ws2019_network_stack_settings_nettcp_backup.csv

​
默认情况下,在Windows Server 2019和Windows 10 1709 +中,使用TCP的CUTRIC实现。此算法针对具有高延迟的高速网络进行了优化(默认情况下在 Linux 内核 2.6.19 及更高版本中也使用它)。

Windows TCP stack on Windows Server 2019 based on CUBIC

仅在 Windows Server 2019 或 Hyper-V 2019 中应用以下设置。

为 LAN 应用新的 NetTCP 设置:

Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled

对于广域网:

Set-NetTCPSetting -SettingName InternetCustom,Internet -CongestionProvider CTCP
Set-NetTCPSetting -SettingName InternetCustom,Internet -DelayedAckTimeoutMs 50
Set-NetTCPSetting -SettingName InternetCustom,Internet -ForceWS Disabled

在 TCP 堆栈级别禁用网络 RSS 和 RSC 网络优化方法:

netsh int tcp show global
netsh int tcp set global RSS=Disabled
netsh int tcp set global RSC=Disabled

或在网卡级别:

Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Recv Segment Coalescing (IPv4)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Recv Segment Coalescing (IPv6)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Receive Side Scaling" -DisplayValue "Disabled" –NoRestart

为所有虚拟机禁用 vRSS:

Get-VM | Set-VMNetworkAdapter -VrssEnabled $FALSE

在网卡上禁用大型发送卸载 (LSO):
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Large Send Offload Version 2 (IPv4)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Set-NetAdapterAdvancedProperty -DisplayName "Large Send Offload Version 2 (IPv6)" -DisplayValue "Disabled" -NoRestart
Get-NetAdapter | Restart-NetAdapter

您还可以在网络适配器属性的“高级”选项卡中禁用这些选项:

  • 接收段合并 (IPv4/IPv6) = 禁用
  • 大型发送卸载 v2 (IPv4/IPv6) = 已禁用

disable recv segment coalescing on hyper-v

这些TCP堆栈设置将使Windows Server 2019网络协议设置类似于以前的Windows Server版本。

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐