Несколько раз встречался с тем, что скорость копирования файлов по сети с/на виртуальные машины на 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 сегментов в меньшее количество более крупных сегментов. Увеличение производительности сети достигается за счет того, что несколько больших сегментов обрабатывают быстрее множества мелких.
Наличие включенной поддержки RSC часто бывает источником дополнительной сетевой задержки в некоторых комбинациях железа.
По умолчанию в Windows Server 2019 RSC включен для всех внешних (External) vSwitches.
Проверить, включен ли 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 на хосте:
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 и их статус с помощью PowerShell:
Get-NetAdapterVmq
Чтобы отключить VMQ для определенного адаптера, выполните команду (сетевой адаптер будет недоступен в течении пары секунд):
Set-NetAdapterVmq -Name “NICName” -Enabled $False
После отключения VMQ лучше перезагрузить хост и проверить сетевую производительность.
Оптимизация параметров протокола 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:\ps\nettcp_backup.csv
Примените новые настройка для 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
- Recv Segment Coalescing (IPv4/IPv6) = Disabled
- Large Send Offload V2 (IPv4/IPv6) = Disabled
Данные настройки стека TCP максимально приблизят настройки сетевых протоколов Windows Server 2019 к предыдущим версиям Windows Server.
Не сталкивался с этим.
Спасибо за разбор полётов.
Вдруг пригодится.
Спасибо за статью, действительно может пригодиться!
Но интересно почему вы не упомянули технологию SR-IOV? Вероятно она тоже может повлиять на производительность сети, т.к. это по сути аппаратная виртуализация сетевой карты.
Вы правы, SR-IOV также может влиять на обработку трафика.
Но по умолчанию она вроде отключена для Hyper-V коммутатора, по крайне мере я пока не встречал какихто импактов от sriov. Но в следующий раз буду смотреть )
Я не имел в виду, что от неё какие-то проблемы. Наоборот — думаю, что имеет смысл её включать всегда когда это возможно. Но вот тут-то как раз не так всё просто оказалось — не достаточно просто галочку поставить. Нужно в биосе включить, причём иногда параметры которые с SR-IOV казалось бы не связаны. Убедиться, что сетевой контроллер поддерживает и что на данной конкретной мамке это активированно. Например на мамке может быть два сетевых порта на разных контроллерах, которые оба поддерживают SR-IOV по даташиту, но работает оно только на одном. Потом убедится через Power Shell, что оно заработало на уровне адаптера и на уровне виртуально коммутатора. Включить в виртуалке, проверить по логам 🙂 В общем я как-то целый день потратил, что бы разобраться. Накидал для себя памятку. Могу вам заслать, может на основе неё полноценный пост напишете. В рунете я такой инфы вроде не видел.
Конечно присылайте, помогу собрать все в кучку и запилить статью.
Email контакт есть тут https://winitpro.ru/index.php/o-bloge/
Ваша статья про SR-IOV запощена тут. Спасибо за инфу
https://winitpro.ru/index.php/2021/09/21/nastroyka-sr-iov-vm-hyper-v/
Не могли бы Вы изменить Upload скорость в терминальной сессии локальных подключаемых дисков
через RD gateway? Начиная с Windows 2019 скорость катастрофически падает. На одном Hyper-V сервере
upload spead из сервера 2012 составляет 1MB/s, из сервера 2019/2022 всего 355 KB/s. Причем при копировании из сервера 2019/2022 окно терминального сервера перестает воспринимать мышь и клавиатуру и зависает. Ресурсов везде достаточно.
Да, есть такая проблема — низкая скорость сети в Hyper-V 2019 по сравнению со старыми версиями. Рекомендации из статьи пробовали?
Да, но каких-то существенных улучшений пока замечено не было.
Причем подключение без шлюза (gateway) работает отлично. Что-то происходит на уровне шлюза.
Немного не понял вашу конфигурацию. Т.е. внешние пользователи (по отношению к Hyper-V хосту) подключаются на RDGW, который крутится на Hyper-V. И при таком подключении наблюдают низкую скорость копирования в RDP сессии.
А при подключении напрямую на RDSH хост на том же самом Hyper-V проблемы нет?
Верно. Еще интересная особенность, если подключаться через RDGW на версии Windows 2012,
то скорость отличная. На современных 2019/2022 всего 355 KB/s
Подскажите, а не сталкивались с проблемой, когда на гипервизоре 2012R2, на одной из VM скорость на upload режется на 2Мбит/с, при этом download — выше 100?
У меня такая же проблема была, пока внутри ВМ не выполнил команды:
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
Скорость стала нормальной
не помогло 🙁 в ps на виртуалке нет поддержки команды netadapter 🙁
поменял руками, никакого эффекта 🙁
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.02 sec 384 KBytes 3.10 Mbits/sec
[ 4] 1.02-2.02 sec 128 KBytes 1.05 Mbits/sec
[ 4] 2.02-3.02 sec 256 KBytes 2.10 Mbits/sec
[ 4] 3.02-4.02 sec 128 KBytes 1.05 Mbits/sec
[ 4] 4.02-5.02 sec 256 KBytes 2.10 Mbits/sec
[ 4] 5.02-6.02 sec 128 KBytes 1.05 Mbits/sec
[ 4] 6.02-7.02 sec 256 KBytes 2.10 Mbits/sec
[ 4] 7.02-8.02 sec 128 KBytes 1.05 Mbits/sec
[ 4] 8.02-9.02 sec 256 KBytes 2.10 Mbits/sec
[ 4] 9.02-10.02 sec 256 KBytes 2.10 Mbits/sec
— — — — — — — — — — — — — — — — — — — — — — — — —
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.02 sec 2.12 MBytes 1.78 Mbits/sec sender
[ 4] 0.00-10.02 sec 2.08 MBytes 1.74 Mbits/sec receiver
Заколдованный интерфейс 🙁
Интересно, что когда поднимаю на этой BM iperf -s, то скорость 100М… ЧЯДНТ?!
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.01 sec 5.00 MBytes 41.4 Mbits/sec
[ 4] 1.01-2.01 sec 7.50 MBytes 63.0 Mbits/sec
[ 4] 2.01-3.01 sec 9.88 MBytes 83.0 Mbits/sec
[ 4] 3.01-4.01 sec 6.25 MBytes 52.5 Mbits/sec
[ 4] 4.01-5.01 sec 8.62 MBytes 72.5 Mbits/sec
[ 4] 5.01-6.00 sec 12.1 MBytes 102 Mbits/sec
[ 4] 6.00-7.00 sec 8.75 MBytes 73.5 Mbits/sec
[ 4] 7.00-8.00 sec 12.0 MBytes 101 Mbits/sec
[ 4] 8.00-9.01 sec 11.9 MBytes 98.3 Mbits/sec
[ 4] 9.01-10.01 sec 8.38 MBytes 70.4 Mbits/sec
— — — — — — — — — — — — — — — — — — — — — — — — —
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.01 sec 90.4 MBytes 75.7 Mbits/sec sender
[ 4] 0.00-10.01 sec 90.2 MBytes 75.6 Mbits/sec receiver
Помогло
Спасибо, спасли.
В моём случае проблема была не в падении скорости копирования файлов по сети, а в запуске сетевых приложений (когда программа стоит на сервере, а у клиентов только вытянуты ярлычки на рабочий стол). Программы тормозили жутко, вместо 5-10 секунд на запуск уходило 5-10 минут. Отключил Receive Segment Coalescing и всё заработало как надо!
Применимо ли что-либо из перечисленого к HyperV-свитчу который обслуживает Частную сеть?
Всем привет. Есть Hyper-V 2019 с кучей виртуалок и на ней проблема с линуксовыми виртуалками, они время от времени перестают быть доступными, но если зайти на них с хоста и пропинговать шлюз, то всё приходит в норму. Физическая сетевая карта которая прокинута под виртуалки Broadcom NetXtreme Gigabit Ethernet. На просторах интернета прочитал, что проблема может быть с ней, а точнее с какой-то версией драйверов, драйвера обновил, не помогло. С виндовыми виртуалками всё отлично. Может кто сталкивался.