Низкая скорость сети на хосте Hyper-V с Windows Server 2019

Несколько раз встречался с тем, что скорость копирования файлов по сети с/на виртуальные машины на Hyper-V в Windows Server 2019 намного ниже, чем в ВМ аналогичной конфигурации на хосте с Windows Server 2016. В некоторых тестах скорость записи/чтения данных по сети на ВМ в Windows Server 2019 почти в три раза ниже, чем в WS2016 (тестировалось копирование по SMB, SSH/SCP). Эта статья не претендует на абсолютную истину, но в ней я попытался собрать различные методики улучшения производительности сети в виртуальных машинах Hyper-V на Windows Server 2019 (и последних билдах Windows 10).

Receive Segment Coalescing в Hyper-V 2019

В первую очередь нужно вспомнить про технологии Receive Segment Coalescing (RSC) , которая появилась в Hyper-V на Windows Server 2019/2022 (и в Windows 10 начиная с билда 1809). Receive Segment Coalescing используется на уровне виртуального коммутатора (vSwitch), позволяет снизить нагрузку на CPU и увеличить пропускную способность сети за счет объединения нескольких TCP сегментов в меньшее количество более крупных сегментов. Увеличение производительности сети достигается за счет того, что несколько больших сегментов обрабатывают быстрее множества мелких.

В предыдущих версиях Hyper-V на Windows Server 2016/2012R2 поддерживалась только аппаратная версия Receive Segment Coalescing на уровне сетевой карты.

Наличие включенной поддержки RSC часто бывает источником дополнительной сетевой задержки в некоторых комбинациях железа.

Проблема проявляется как в полноценной Windows Server 2019 с графическим интерфейсом, так и в бесплатной редакции Windows Hyper-V Server .

По умолчанию в Windows Server 2019 RSC включен для всех внешних (External) vSwitches.

Проверить, включен ли RSC для виртуальных коммутаторов можно командой:

Get-VMSwitch | Select-Object *RSC*

Можно запретить использовать RSC для IPv4 трафика на уровне клиентского сетевого адаптера:

Disable-NetAdapterRsc -Name "Ethernet" -IPv4

Проверьте, увеличится ли скорость копирования в ВМ на Hyper-V при отключении RSC. Если скорость сети увеличилась, можно отключить RSC на виртуальном коммутаторе, к которому подключена ВМ.

Пропускную способность сети можно замерить с помощью утилиты iperf .

Чтобы отключить программный RSC для определенного виртуального коммутатора, выполните команду:

Set-VMSwitch -Name vSwitchName -EnableSoftwareRsc $false

отключить EnableSoftwareRsc в параметрах виртуального коммутатора в Hyper-V Windows Server 2019

Включить/отключить RSC можно на лету, это не повлияет на активные подключения.

Либо можно полностью отключить RSC на хосте:

netsh int tcp set global rsc=disabled

Режим VMQ в драйвере сетевого адаптера

В некоторых случаях наличие включенной опции VMQ (Virtual Machine Queue) в драйвере сетевого адаптера физического хоста Hyper-V может привести к плохой производительности сети в виртуальных машинах Hyper-V. Связано это с тем, что VMQ это аппаратная функция, и, если она не поддерживается железом, но включена в драйвере это вызывает потерю пакетов и увеличивает сетевую задержку. Эта проблема характерна для сетевых карточек Broadcom Gigabit и встречается во всех версиях Hyper-V на Windows 2012 R2/2016/2019.

VMQ предназначен для повышения производительности сети за счет передачи пакетов от физического сетевого адаптера напрямую виртуальным машинам.

Вы можете отключить VMQ в свойствах драйвера сетевого адаптера.

Virtual Machine Queue в свойствах драйвера сетевой карты broadcom

Либо вы можете вывести список сетевых адаптеров с поддержкой VMQ и их статус с помощью PowerShell:

Get-NetAdapterVmq

Чтобы отключить VMQ для определенного адаптера, выполните команду (сетевой адаптер будет недоступен в течении пары секунд):

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

Get-NetAdapterVmq отключить VMQ (Virtual Machine Queue) для сетевых адаптеров

После отключения VMQ лучше перезагрузить хост и проверить сетевую производительность.

Убедитесь, что в Windows не действуют политики ограничения скорости QoS .

Оптимизация параметров протокола TCP для Windows Server 2019 Hyper-V

Сохраните текущие настройки 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:psnettcp_backup.csv

В Windows Server 2019 и Windows 10 1709+ по-умолчанию используется реализация протокола TCP — CUBIC . Данный алгоритм оптимизирован для использования в высокоскоростных сетях с большой задержкой (также используется по-умолчанию в ядре Linux начиная с 2.6.19).

Новые настройки Get-NetTCPSetting в Windows Server 2019

Следующие настройки нужно применять только на Windows Server 2019 или Hyper-V 2019.

Примените новые настройка для LAN сети:

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

Отключите функцию Large Send Offload (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

Также эти опции можно отключить в свойствах сетевого адаптера на вкладке Advanced:

  • Recv Segment Coalescing (IPv4/IPv6) = Disabled
  • Large Send Offload V2 (IPv4/IPv6) = Disabled

отключить Large Send Offload V2

Данные настройки стека TCP максимально приблизят настройки сетевых протоколов Windows Server 2019 к предыдущим версиям Windows Server.

EnglishRussianUkrainian