SR-IOV (Single Root Input/Output Virtualization) это технология виртуализации аппаратных устройств хоста, позволяющая предоставить виртуальным машинам прямой доступ к устройствам. Технология позволяет виртуализировать различные виды устройств, но чаще всего используется для виртуализации сетевых адаптеров. В этой статье мы расскажем, как правильно включить и настроить SR-IOV для сетевых адаптеров виртуальных машин на сервере Hyper-V.
SRV-IOV поддерживается в Hyper-V начиная с версии 2012, в том числе в бесплатном Hyper-V Server. Мы не будем погружаться в теорию SR-IOV, вы можете найти подробное описание технологии в сети. Для практического понимания достаточно знать, что SR-IOV позволяет предоставить доступ виртуальным машинам непосредственно к физическим сетевым адаптерам хоста, минуя обработку трафика виртуальными коммутаторами Hyper-V. Один физический сетевой адаптер в режиме SR-IOV может обслуживать несколько виртуальных машин.
Благодаря использованию SR-IOV для виртуальных машин Hyper-V вы существенно увеличите пропускную способность, снизите сетевую задержку и уменьшите нагрузку на CPU, вызванную необходимостью обрабатывать сетевой трафик программными средствами Hyper-V.
Чтобы SRV-IOV работала на вашем хосте Hyper-V нужно выполнять ряд условий.
В первую очередь нужно включить поддержку SR-IOV и виртуализации в BIOS вашего сервера. В зависимости от вендора и модели сервера эти настройки могут отличаться.
- Виртуализация: Intel (Virtualization Technology, Intel VT, VT-d, Vanderpool), AMD (SVM, AMD-V)
- IOMMU
- SR-IOV
- ASPM
Каких-то пунктов может и не быть, даже пункта SR-IOV. Но это не означает, что SR-IOV не поддерживается сервером. Например, на материнских платах Supermicro пункт SR-IOV может отсутствовать, и при этом есть отключенный по умолчанию пункт ASPM. Если включить ASPM и поддержку виртуализации, то SR-IOV включится автоматически.
Вы можете проверить, поддерживается ли технология SR-IOV вашим Hyper-V сервером на аппаратном уровне с помощью PowerShell:
(get-vmhost).IovSupport
(get-vmhost).IovSupportReasons
Если ваш сервер поддерживает эту функцию, то в поле IovSupport будет указано True. Если не поддерживает, то False. При этом в пункт IovSupportReasons будет описание причины, из-за которой SR-IOV не поддерживается. Причина как правило указывается довольно подробно. Вот типовые причины:
- Ensure that the system has chipset support for SR-IOV and that I/O virtualization is enabled in the BIOS.
- To use SR-IOV on this system, the system BIOS must be updated to allow Windows to control PCI Express. Contact your system manufacturer for an update.
- To use SR-IOV on this computer, the BIOS must be updated because it contains incorrect information describing the hardware capabilities. Contact your computer manufacturer for an update.
- SR-IOV cannot be used on this computer because the processor does not support second-level address translation (SLAT). For Intel processors, this feature might be referred to as Extended Page Tables (EPT). For AMD processors, this feature might be referred to as Rapid Virtualization Indexing (RVI) or Nested Page Tables (NPT).
- The chipset on the system does not do interrupt remapping, without which SR-IOV cannot be supported.
- The chipset on the system does not do DMA remapping, without which SR-IOV cannot be supported.
- SR-IOV cannot be used on this system as it has been configured to disable the use of I/O remapping hardware.
- SR-IOV cannot be used on this system as it is reporting that there is no PCI Express Bus. Contact your system manufacturer for further information.
- SR-IOV cannot be used on this system as the PCI Express hardware does not support Access Control Services (ACS) at any root port. Contact your system vendor for further information.
Полный вывод команды
get-vmswitch | fl *iov*
дает ряд полезной информации. Например:
IovVirtualFunctionCount : 6 IovVirtualFunctionsInUse : 3
Такие цифры сразу покажут сколько виртуальных устройств IOV доступно и сколько уже использовано виртуальными машинами.
При создании виртуального коммутатора Hyper-V нужно установить галочку поддержки SR-IOV — Enable single-root I/O virtualization (SR-IOV).
Либо включать опцию EnableIOV при создании коммутатора из командной строки PowerShell:
New-VMSwitch -Name "Ext_network" -NetAdapterName "Ethernet 2" -EnableIov 1
Причём наличие поддержки SR-IOV на самом хосте гипервизора вовсе не означает, что оно заработает на конкретном виртуальном коммутаторе. Нужно что бы этот коммутатор был привязан к сетевому адаптеру с поддержкой SR-IOV.
Есть еще один нюанс. На материнской плате может быть несколько сетевых адаптеров, но SR-IOV может поддерживаться только на части из них. Причём поддержка SR-IOV самим адаптером по даташиту вовсе не означает, что оно работает на данной конкретной материнской карте!
Поэтому после сборки коммутатора проверьте его командой:
get-vmswitch | select IovSupport, IovSupportReasons, IovEnabled
Параметр IovEnabled показывает включен ли он.
Список сетевых адаптеров с поддержкой SR-IOV можно вывести с помощью PowerShell:
Get-NetAdapterSriov | sort name | ft Name, InterfaceDescription, SriovSupport
После того, как SR-IOV включен на уровне гипервизора и виртуального коммутатора, теперь его можно включить в виртуальных машинах (по умолчанию выключено). Опция Enable SR-IOV доступ в секции Hardware Acceleration сетевой карты виртуальной машины.
Либо можно включить SR-IOV для сетевого адаптера виртуальной машины через PowerShell:
Set-VMNetworkAdapter -VMName testvm -VMNetworkAdapterName “Network Adapter” -IovWeight 100
Ошибки при работе SR-IOV пишутся на Hyper-V в отдельный журнал в Event Viewer:
Application and Services Logs -> Microsoft -> Windows -> Hyper-V-SynthNic -> Admin.
Если SR-IOV работает штатно, то при запуске виртуальной машины в логе будут такие записи:
12597 Network adapter (%NIC_ID%) Connected to virtual network. 12582 Network adapter (%NIC_ID%) started successfully. 12584 Network adapter (%NIC_ID%) allocated a virtual function. 12588 Network adapter (%NIC_ID%) assigned a virtual function.
Технология SR-IOV дает хороший буст сетевой производительности виртуальных машин и гипервизора в целом. Максимальные результаты от использования SR-IOV вы заметите на хостах Hyper-V с большим трафиком виртуальных машин, который вызывает сильную нагрузку на хостовые CPU.
Спасибо. А нет ли опыта включения SR-IOV на материнских платах ASUS?
Вот какой результат дает диагностика:
(get-vmhost).IovSupport
True
(get-vmhost).IovSupportReasons
Вторая функция ничего не возвращает.
У Вас уже всё работает (IovSupport=True). Если НЕ работает, то IovSupportReasons указывается причина почему не работает (а если работает ,то там пусто).
Пересобирайте теперь виртуальный коммутатор (если он был собран без галки SR-IOV) и проверяйте работает ли в нём.
Если функция (get-vmhost).IovSupportReasons не возвращает ничего, то это не означает, что все работает.
В логах есть несколько ошибок:
Master_179_0_0: EXT_QP_MAX_RETRY_LIMIT/EXT_QP_MAX_RETRY_PERIOD registry keys were requested by user but FW does not support this feature. Please upgrade your firmware to support it.
For more details, please refer to WinOF User Manual.
Master_179_0_0: SRIOV cannot be enabled. Running in single-function mode.
Bios на материнке и сетевых картах последний. Вполне вероятно, что MB Asus bios не поддерживает эту функцию.
Да, я не совсем верно выразился. IovSupport=True не означает, что SR-IOV работает. Это означает, что хост в принципе поддерживает эту технологию и, в частности, то, что она включена в BIOS’е.
При этом (get-vmhost).IovSupportReasons возвращает либо «ОК» либо пустое значение (вероятно в зависимости от версии ОС, но это не точно). Короче IovSupportReasons имеет смысл если IovSupport=False.
Но что бы технология заработала нужна ещё поддержка стороны сетевого адаптера. И об этом мы узнаем собрав коммутатор и проверив в нём вывод:
get-vmswitch | select IovSupport, IovSupportReasons, IovEnabled
Если сетевой адаптер не поддерживает технологию или производитель мамки не посчитал нужным её реализовывать, то увы. Видимо это как раз ваша ситуация. Мать вероятно не серверная?
(собственно в посте всё это написано, тут я ничего нового не сказал)
Кстати я предпочитаю команды:
get-vmhost | fl
и
get-vmswitch | fl
Они дают более подробный вывод.
>Мать вероятно не серверная?
Верно, игровая.
IovVirtualFunctionCount : 8
IovVirtualFunctionsInUse : 0
Написал производителям БИОСа, может помогут разобраться.
Можно полный вывод «get-vmswitch | fl» увидеть? Любопытно.
Вообще я предполагаю, что на не серверных матерях мало шансов встретить рабочую реализацию. Тем более если сетевуха интегрированная, скорее всего она в принципе такое не умеет. Можно попробовать воткнуть PCI-E сетевую карту. Но опять же предполагаю, что это должна быть серверная сетевая карта, а они стоят весьма нарядно.
Name : Mellanox
Id : fb7cb754-7256-45c2-83ea-8dbb64b63a47
Notes :
Extensions : {Microsoft Windows Filtering Platform, Microsoft NDIS Capture}
BandwidthReservationMode : None
PacketDirectEnabled : False
EmbeddedTeamingEnabled : True
AllowNetLbfoTeams : False
IovEnabled : True
SwitchType : External
AllowManagementOS : True
NetAdapterInterfaceDescription : Teamed-Interface
NetAdapterInterfaceDescriptions : {Mellanox ConnectX-3 Pro Ethernet Adapter}
NetAdapterInterfaceGuid : {552ea5fb-766d-4714-ac65-028da6379fb3}
IovSupport : True
IovSupportReasons :
AvailableIPSecSA : 0
NumberIPSecSAAllocated : 0
AvailableVMQueues : 516096
NumberVmqAllocated : 1
IovQueuePairCount : 8027
IovQueuePairsInUse : 16
IovVirtualFunctionCount : 8
IovVirtualFunctionsInUse : 0
PacketDirectInUse : False
DefaultQueueVrssEnabledRequested : True
DefaultQueueVrssEnabled : True
DefaultQueueVmmqEnabledRequested : True
DefaultQueueVmmqEnabled : True
DefaultQueueVrssMaxQueuePairsRequested : 16
DefaultQueueVrssMaxQueuePairs : 8
DefaultQueueVrssMinQueuePairsRequested : 1
DefaultQueueVrssMinQueuePairs : 1
DefaultQueueVrssQueueSchedulingModeRequested : StaticVrss
DefaultQueueVrssQueueSchedulingMode : StaticVrss
DefaultQueueVrssExcludePrimaryProcessorRequested : False
DefaultQueueVrssExcludePrimaryProcessor : False
SoftwareRscEnabled : True
RscOffloadEnabled : False
BandwidthPercentage : 0
DefaultFlowMinimumBandwidthAbsolute : 0
DefaultFlowMinimumBandwidthWeight : 0
CimSession : CimSession: .
ComputerName : HV3
IsDeleted : False
DefaultQueueVmmqQueuePairs : 8
DefaultQueueVmmqQueuePairsRequested : 16
Так, но тут же видно, что на уровне виртуального коммутатора тоже всё работает.
Надо смотреть что в логе Application and Services Logs -> Microsoft -> Windows -> Hyper-V-SynthNic -> Admin.
Вот те логи, которые Вы выше приводили, они откуда взяты?
У вас там никакой тиминг не используется случайно? Смущает «NetAdapterInterfaceDescription : Teamed-Interface».
Брали логи из mlx4_bus
>Application and Services Logs -> Microsoft -> Windows -> Hyper-V-SynthNic -> Admin.
Такого нет. Есть Application and Services Logs -> Microsoft -> Windows -> Hyper-V-VmSwitch -> Operational. Там ошибок нет.
Создавали VMSwitch с помощью команды:
New-VMSwitch -Name Mellanox -NetAdapterName «M12_4» -EnableEmbeddedTeaming $true -EnableIov $true
Нашли логи в Application and Services Logs -> Microsoft -> Windows -> Hyper-V-Worker -> Admin.
12582 Network Adapter (D177948B-D880-42BC-ADDC-46B26F6FBFA8) started successfully. (Virtual Machine ID 364A642F-EB19-4900-B2F5-1AE3236FF9AE)
12597 Network Adapter (364A642F-EB19-4900-B2F5-1AE3236FF9AE—D177948B-D880-42BC-ADDC-46B26F6FBFA8) Connected to virtual network. (Virtual Machine ID 364A642F-EB19-4900-B2F5-1AE3236FF9AE)
12584 Network Adapter (364A642F-EB19-4900-B2F5-1AE3236FF9AE—D177948B-D880-42BC-ADDC-46B26F6FBFA8) allocated a virtual function. (Virtual Function ID 0 LUID 0:22233d77 Virtual Machine ID 364A642F-EB19-4900-B2F5-1AE3236FF9AE)
12589 The description for Event ID 12589 from source Microsoft-Windows-Hyper-V-SynthNic cannot be found. Either the component that raises this event is not installed on your local computer or the installation is corrupted. You can install or repair the component on the local computer.
If the event originated on another computer, the display information had to be saved with the event.
The following information was included with the event:
rds5
364A642F-EB19-4900-B2F5-1AE3236FF9AE
364A642F-EB19-4900-B2F5-1AE3236FF9AE—D177948B-D880-42BC-ADDC-46B26F6FBFA8
Network Adapter
0
0:22233d77
%%2147942431
0x8007001F
The system cannot find message text for message number 0x%1 in the message file for %2
12586 Network Adapter (364A642F-EB19-4900-B2F5-1AE3236FF9AE—D177948B-D880-42BC-ADDC-46B26F6FBFA8) freed a virtual function. (Virtual Function ID 0 Virtual Machine ID 364A642F-EB19-4900-B2F5-1AE3236FF9AE)
mlx4_bus это видимо какая-то проприетарщина от производителя сетевого адаптера? Я с такими адаптерами дела не имел поэтому тут мне что-то трудно комментировать.
По логам видно, что виртуальная машина пытается получить виртуализированный адаптер (id 12584). Затем происходит нечто, что не имеет описания (id 12589). И далее машина виртуализированный адаптер сразу высвобождает (id 12586).
При этом забавно, что сам гипервизор считает, что ничего препятствующего работе SR-IOV нет.
Что здесь происходит сложно сказать. На вашем месте я бы попробовал пересобрать коммутатор без параметра «-EnableEmbeddedTeaming $true». Но я не знаю для каких целей Вы его включали. Если просто для красоты, то он явно не нужен. Я собирал без него и у меня всё работает (правда у меня сетевые адаптеры от Intel и мать серверная SuperMicro).
Автор в начале статьи упомянул, что SR-IOV не совместим с NIC teaming. Может быть в этом вся причина.
С другой стороны этот mlx4_bus пишет что-то про «FW не поддерживает эту функцию». Но имеется ли в виду SR-IOV?
Собрал коммутатор без параметра -EnableEmbeddedTeaming $true. Результат тот же.
У меня сетевой адаптер с двумя портами на 40 GB. объединил их для увеличения количества
виртуальных функций. Результат тот же.
В Биосе включил технологии управляющие питанием. Результат тот же.
Все же прихожу к выводу, что не поддерживает материнская плата.
материнская плата SuperMicro H12SSL-NT, ОС Server 2019 Standart.
почемуто на родных сетевых картах Broadcom 10GBASE-T показывает SriovSupport — Not Supported, что странно.
Отдельно поставили Intel X520 — там показывает Supported. Собственно SR-IOV нам только на Intel и нужен. Но всёже загадка почему на Broadcom не работает.
да и (get-vmhost).IovSupportReasons не показывает вообще ничего, но (get-vmhost).IovSupport показывает нормально True.
виртуальный коммутатор вроде создал, вроде работает, но не пойму всё ли правильно или нет. У меня кстати тоже нету в журналах Hyper-V-SynthNic, но в остальных вообще ниодной ошибки.
«почемуто на родных сетевых картах Broadcom 10GBASE-T показывает SriovSupport — Not Supported»
Это где так показывает? В информации о коммутаторе собранном на Броадкомах? IovSupportReasons при этом что показывает?
«Но всёже загадка почему на Broadcom не работает»
Потому что этот броадком может не поддерживать данную технологию либо она может быть не реализована производителем матери. У меня Супермикра с четырьмя сетевухами Интел на борту. Все эти сетевухи по даташиту поддерживают SR-IOV. Но работает оно только на двух.
«да и (get-vmhost).IovSupportReasons не показывает вообще ничего»
Это нормально. В Reasons показывает причину почему НЕ работает. А если работает там будет либо «OK» либо просто пусто (от версии ОС зависит видимо).
«виртуальный коммутатор вроде создал, вроде работает»
Если «get-vmswitch | fl» выдает IovSupport=True и IovEnabled=True значит всё работает.
«У меня кстати тоже нету в журналах Hyper-V-SynthNic»
У меня гипервизоры на 2012 R2. Может в 2019-ом переименовали. Выше написали, что вроде нашли их в Application and Services Logs -> Microsoft -> Windows -> Hyper-V-Worker -> Admin.
Get-NetAdapterSriov | sort name | ft Name, InterfaceDescription, SriovSupport
Name InterfaceDescription SriovSupport
—- ——————— ————
LAN1(MAIN) Intel(R) Ethernet Server Adapter X520-2 #2 Supported
LAN2(GUEST) Supermicro 10GBASE-T Ethernet Controller #2 NotSupported
LAN3(BACKUP) Intel(R) Ethernet Server Adapter X520-2 Supported
WAN(INTERNET) Supermicro 10GBASE-T Ethernet Controller NotSupported
не, на броадкомах как раз не собирал. Нам надо как раз на Intel.
ну както странно. Современная материнка под AMD EPYC на базе ZEN2 и ZEN3 (именно новая модель а не новая ревизия старой от первых EPYC под новые), современные 10Гбит\с сетевые адаптеры Dual 10GBase-T LAN via Broadcom BCM57416, и показывает NotSupported.
ну вот так както, и вроде работает:
Name : LAN1(MAIN)
Id : b9f6fd7a-5fe2-49b5-a76d-d4d40dc9b486
Notes :
Extensions : {Платформа фильтрации Microsoft Windows, Захват Microsoft NDIS}
BandwidthReservationMode : None
PacketDirectEnabled : False
EmbeddedTeamingEnabled : False
IovEnabled : True
SwitchType : External
AllowManagementOS : True
NetAdapterInterfaceDescription : Intel(R) Ethernet Server Adapter X520-2 #2
NetAdapterInterfaceDescriptions : {Intel(R) Ethernet Server Adapter X520-2 #2}
NetAdapterInterfaceGuid : {cf8e218d-3303-4c71-b1ee-6933e6af6fd2}
IovSupport : True
IovSupportReasons :
AvailableIPSecSA : 2048
NumberIPSecSAAllocated : 0
AvailableVMQueues : 1
NumberVmqAllocated : 1
IovQueuePairCount : 127
IovQueuePairsInUse : 4
IovVirtualFunctionCount : 62
IovVirtualFunctionsInUse : 0
PacketDirectInUse : False
DefaultQueueVrssEnabledRequested : True
DefaultQueueVrssEnabled : True
DefaultQueueVmmqEnabledRequested : True
DefaultQueueVmmqEnabled : True
DefaultQueueVrssMaxQueuePairsRequested : 16
DefaultQueueVrssMaxQueuePairs : 2
DefaultQueueVrssMinQueuePairsRequested : 1
DefaultQueueVrssMinQueuePairs : 1
DefaultQueueVrssQueueSchedulingModeRequested : StaticVrss
DefaultQueueVrssQueueSchedulingMode : StaticVrss
DefaultQueueVrssExcludePrimaryProcessorRequested : False
DefaultQueueVrssExcludePrimaryProcessor : False
SoftwareRscEnabled : True
BandwidthPercentage : 0
DefaultFlowMinimumBandwidthAbsolute : 0
DefaultFlowMinimumBandwidthWeight : 0
CimSession : CimSession: .
ComputerName : TEST
IsDeleted : False
DefaultQueueVmmqQueuePairs : 2
DefaultQueueVmmqQueuePairsRequested : 16
Ну вот кстати командлет Get-NetAdapterSriov (про который я не знал) показывает же информацию поддерживается ли и если не поддерживается, то почему. Скажем у меня вывод такой:
Name : Ethernet 6
InterfaceDescription : Intel(R) I350 Gigabit Network Connection #3
Enabled : True
SriovSupport : Supported
SwitchName : DefaultSwitchName
NumVFs : 6
Name : Ethernet 7
InterfaceDescription : Intel(R) I350 Gigabit Network Connection #4
Enabled : True
SriovSupport : Supported
SwitchName : DefaultSwitchName
NumVFs : 6
Name : Ethernet 5
InterfaceDescription : Intel(R) Ethernet Controller X540-AT2 #2
Enabled : True
SriovSupport : NoVfBarSpace
SwitchName : DefaultSwitchName
NumVFs : 62
Name : Ethernet 4
InterfaceDescription : Intel(R) Ethernet Controller X540-AT2
Enabled : True
SriovSupport : NoVfBarSpace
SwitchName : DefaultSwitchName
NumVFs : 62
На обоих X540 указано NoVfBarSpace (расшифровку причин можно посмотреть здесь: https://docs.microsoft.com/en-us/powershell/module/netadapter/get-netadaptersriov?view=windowsserver2019-ps).
И возможно даже кручением разных настроек в биосе удастся заставить работать. Но большая проблема в том, то в биосе Супермикро (да и любой другой мастери, что уж) есть много мало понятных параметров вида «XXX: Enabled/Disabled», а описание этих параметров в мануле вот такое «Эта настройка включает/выключает XXX» (спасибо, кэп, а то ятак-то не понял). А вот что такое этот XXX хрен где найдёшь.
Я намедни новый сервак на Супермикро поднимал. Крутнул в биосе один такой вот параметр без описания, который, как мне казалось, отвечает всего лишь за энергосбережение на процессоре. Так после этого винда виснуть начала при попытке включения HVCI. Так что на боевом сервере я бы поостерёгся такие эксперименты проводить. Если сервер еще не в работе, то можно покрутить конечно.
«не, на броадкомах как раз не собирал. Нам надо как раз на Intel.»
Ну собрал же, работает как надо. Чего переживать-то? 🙂
«ну както странно»
Заметь, что в расшифровке нет даже варианта такого — «NotSupported». Т.е. похоже, что это банально не поддерживается сетевым адаптером. Если интересно надо поискать даташит на адаптер и посмотреть там. У Интела такая инфа точно есть на ark.intel.com. Насчет Броадкома не уверен, что найти получится.
вот тут хз. Энергосберегайки и всякое прочее по дефолту. только всевозможные виртуализации включил — SVM и SR-IOV. параметров типа IOMMU и ASPM вообще не нашёл. Но мне кажется еслиб дело было в них, врядли бы и на Intel заработало, однако там вроде работает.
откопал даташит по бродкому, написано SR-IOV with up to 128 VFs. тоесть вроде поддерживается.
да вот мало ли потом понадобится вдруг и на бродкомах сделать SR-IOV, а он не может. печально.
Ввёл просто Get-NetAdapter — где у вас NoVfBarSpace у меня показывает просто NotSupported, однако NumVFs показывает как в даташите — 128.
Get-NetAdapterSriov
Name : LAN3(BACKUP)
InterfaceDescription : Intel(R) Ethernet Server Adapter X520-2
Enabled : True
SriovSupport : Supported
SwitchName : DefaultSwitchName
NumVFs : 62
Name : LAN1(MAIN)
InterfaceDescription : Intel(R) Ethernet Server Adapter X520-2 #2
Enabled : True
SriovSupport : Supported
SwitchName :
NumVFs : 62
Name : LAN2(GUEST)
InterfaceDescription : Supermicro 10GBASE-T Ethernet Controller #2
Enabled : True
SriovSupport : NotSupported
SwitchName : Default Switch
NumVFs : 128
Name : WAN(INTERNET)
InterfaceDescription : Supermicro 10GBASE-T Ethernet Controller
Enabled : True
SriovSupport : NotSupported
SwitchName : Default Switch
NumVFs : 128
Если SRV-IOV в включен в биосе значит тиминг запрещен?