Низкая производительность сети на виртуальных машинах 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 и 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-сегментов в более крупные. Производительность сети повышается, поскольку большие сегменты обрабатываются быстрее, чем множество маленьких.

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

Если поддержка RSC включена, это может привести к дополнительной сетевой задержке в некоторых аппаратных конфигурациях.

Проблема возникает как в версиях Windows Server 2019 Full GUI, так и в бесплатной версии Windows Hyper-V Server.

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

Проверить, включен ли 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

проверить, включен ли RSC на коммутаторе hyper-v

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

Или вы можете полностью отключить 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 можно отключить в свойствах драйвера сетевого адаптера.

отключение VMQ (Virtual Machine Queue) в настройках драйвера сетевой карты

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

Get-NetAdapterVmq

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

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

проверить, включен ли vmq в сетевой карте - powershell

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

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

Оптимизация параметров 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

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

Стек Windows TCP в Windows Server 2019 на основе CUBIC

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

Примените новые настройки 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) = отключено

отключение коалесцирования сегментов recv в hyper-v

Эти параметры стека TCP сделают настройки сетевых протоколов Windows Server 2019 похожими на настройки предыдущих версий Windows Server.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *