Поиск по сайту:

Низкая производительность сети на виртуальных машинах 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).

Объединение сегментов приема (RSC) в Hyper-V vSwitch

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

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

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

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

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

Или вы можете полностью отключить 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 и их статус с помощью PowerShell:

Get-NetAdapterVmq

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

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

После отключения 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+ используется реализация TCP CUBIC. Этот алгоритм оптимизирован для высокоскоростных сетей с большой задержкой (он также используется по умолчанию в ядре Linux 2.6.19 и новее).

Примените следующие параметры только в 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

Для глобальной сети:

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

или на уровне NIC:

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)=отключено

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

Статьи по данной тематике