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.