
Несколько раз я сталкивался с ситуацией, когда файлы копировались с/на виртуальные машины на хосте Hyper-V под управлением Windows Server 2019 гораздо медленнее, чем в ВМ той же конфигурации на хосте под управлением Windows Server 2016. В некоторых тестах скорость чтения/записи по сети на ВМ на Windows Server 2019 почти в три раза ниже, чем на WS2016 (тестировалось копирование по SMB, SSH/SCP). В этой статье я постарался описать несколько различных методов повышения сетевой производительности виртуальных машин Hyper-V, работающих на Windows Server 2019 (и последних сборках Windows 10 и 11).
Receive Segment Coalescing (RSC) в коммутаторе Hyper-V vSwitch
Прежде всего, следует обратить внимание на Receive Segment Coalescing (RSC) функция, появившаяся в Hyper-V на Windows Server 2019/2022 (и Windows 10 1809+). Receive Segment Coalescing используется на уровне виртуального коммутатора (vSwitch). RSC позволяет снизить нагрузку на процессор и увеличить пропускную способность сети за счет объединения нескольких TCP-сегментов в более крупные. Производительность сети повышается, поскольку большие сегменты обрабатываются быстрее, чем множество маленьких.
Если поддержка RSC включена, это может привести к дополнительной сетевой задержке в некоторых аппаратных конфигурациях.
По умолчанию RSC включен для всех внешних vSwitches в Windows Server 2019.
Проверить, включен ли RSC для виртуальных коммутаторов, можно с помощью команды:
Get-VMSwitch | Select-Object *RSC*
Отключить использование RSC для трафика IPv4 на клиентском сетевом адаптере можно с помощью следующей команды:
Disable-NetAdapterRsc -Name "Ethernet" -IPv4
Проверьте, увеличилась ли скорость копирования в виртуальной машине Hyper-V после отключения RSC. Если скорость сети увеличилась, можно отключить RSC на виртуальном коммутаторе, к которому подключена ВМ.
Чтобы отключить программный RSC для конкретного виртуального коммутатора, выполните команду:
Set-VMSwitch -Name vSwitchName -EnableSoftwareRsc $false
Или вы можете полностью отключить RSC на хосте Windows:
netsh int tcp set global rsc=disabled
Режим очереди виртуальных машин (VMQ) в драйвере сетевого адаптера
В некоторых случаях, если VMQ (очередь виртуальных машин) включена в драйвере сетевого адаптера физического хоста Hyper-V, это может привести к низкой производительности сети на виртуальных машинах Hyper-V. VMQ — это аппаратная функция, и если она не поддерживается вашим оборудованием, но включена в драйвере, это может привести к потере пакетов и увеличению сетевой задержки. Проблема характерна для гигабитных сетевых адаптеров Broadcom и возникает во всех версиях Hyper-V (Windows Server 2012 R2/2016/2019).
VMQ можно отключить в свойствах драйвера сетевого адаптера.
Или вы можете отобразить список сетевых адаптеров с поддержкой VMQ и их статус с помощью PowerShell:
Get-NetAdapterVmq
Чтобы отключить VMQ для конкретной сетевой карты, выполните приведенную ниже команду (сетевой адаптер будет недоступен в течение нескольких секунд):
Set-NetAdapterVmq -Name “NICName” -Enabled $False
После отключения VMQ лучше перезапустить хост и проверить производительность сети.
Оптимизация параметров TCP для Hyper-V на Windows Server 2019
Сохраните текущие настройки TCP на хосте Hyper-V и примените новые параметры, которые сделают настройки TCP в Windows Server 2019 почти такими же, как в Windows Server 2016.
Сохраните текущие настройки:
Get-NetTCPSetting -SettingName Datacenter,DatacenterCustom,InternetCustom,Internet|select SettingName,CongestionProvider,CwndRestart,ForceWS|Export-csv c:\backup\ws2019_network_stack_settings_nettcp_backup.csv
Примените новые настройки NetTCP для локальной сети:
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CongestionProvider DCTCP
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -CwndRestart True
Set-NetTCPSetting -SettingName DatacenterCustom,Datacenter -ForceWS Disabled
Для WAN:
Set-NetTCPSetting -SettingName InternetCustom,Internet -CongestionProvider CTCP
Set-NetTCPSetting -SettingName InternetCustom,Internet -DelayedAckTimeoutMs 50
Set-NetTCPSetting -SettingName InternetCustom,Internet -ForceWS Disabled
Отключите методы оптимизации сети RSS и RSC на уровне стека TCP:
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
- Recv Segment Coalescing (IPv4/IPv6) = Disabled
- Large Send Offload V2 (IPv4/IPv6) = отключено
Эти параметры стека TCP сделают настройки сетевых протоколов Windows Server 2019 похожими на настройки предыдущих версий Windows Server.