SR-IOV — что это и зачем нужно в виртуализации | Глоссарий FREEHOSTING

SR-IOV

Single Root I/O Virtualization
SR-IOV — SR-IOV (Single Root I/O Virtualization) — стандарт PCIe, позволяющий одному физическому сетевому адаптеру или другому устройству представляться в системе как несколько независимых виртуальных функций (VF), каждая из которых напрямую назначается отдельной виртуальной машине.

Определение простыми словами

SR-IOV — это аппаратная технология, встроенная в PCIe-устройства (чаще всего сетевые карты), которая позволяет одному физическому адаптеру одновременно обслуживать десятки виртуальных машин без участия гипервизора в передаче каждого пакета. Устройство делится на одну физическую функцию (PF) и до 256 виртуальных функций (VF); каждая VF получает собственный PCIe-адрес, очереди DMA и прерывания — и напрямую «пробрасывается» в гостевую ОС через IOMMU.

Без SR-IOV каждый сетевой пакет проходит через программный коммутатор гипервизора (например, virtio или vSwitch), что добавляет задержку и нагружает хостовые CPU. С SR-IOV трафик идёт по пути «NIC → IOMMU → гостевая память» без копирования, что даёт задержки уровня bare-metal и пропускную способность вплоть до линейной скорости порта.

Сравнение

Технология Путь данных Задержка Изоляция
SR-IOV VF NIC → IOMMU → гость (bypass CPU хоста) ~1–5 мкс Аппаратная (IOMMU)
virtio NIC → ядро хоста → vhost → гость ~10–50 мкс Программная
PCI Passthrough NIC → IOMMU → гость (устройство целиком) ~1–5 мкс Аппаратная, 1 VM на порт

Кейсы использования

  • Высоконагруженные сетевые функции (NFV): маршрутизаторы, файрволы, балансировщики на базе DPDK получают доступ к 10/25/100 GbE без накладных расходов ядра.
  • VoIP и финансовые системы: требования к jitter <10 мкс выполняются только при прямом доступе к NIC.
  • HPC-кластеры в облаке: виртуальные машины с SR-IOV VF на InfiniBand или RoCE участвуют в MPI-коммуникациях с почти нулевым overhead.
  • Изолированные multi-tenant сети: каждому арендатору назначается своя VF с отдельным MAC и VLAN-тегом — трафик не смешивается на уровне ПО.

Негативный пример: назначение SR-IOV VF контейнеру в Kubernetes без SR-IOV CNI-плагина (например, sriov-network-device-plugin) приводит к тому, что VF видна только внутри пода, но не регистрируется планировщиком — при перезапуске пода VF не освобождается, возникает утечка ресурсов.

Технические детали

Для включения SR-IOV необходимо: поддержка в BIOS/UEFI (опция SR-IOV или VT-d), загрузка ядра с параметром intel_iommu=on iommu=pt (или amd_iommu=on), и драйвер PF с поддержкой виртуальных функций.

# Проверить поддержку IOMMU
dmesg | grep -e DMAR -e IOMMU

# Убедиться, что устройство поддерживает SR-IOV (totalvfs > 0)
cat /sys/bus/pci/devices/0000:01:00.0/sriov_totalvfs

# Создать 4 виртуальные функции на интерфейсе enp1s0f0
echo 4 > /sys/bus/pci/devices/0000:01:00.0/sriov_numvfs

# Убедиться, что VF появились в системе
lspci | grep -i virtual

# Привязать VF к vfio-pci для передачи в KVM-гостя
modprobe vfio-pci
echo 0000:01:10.0 > /sys/bus/pci/drivers/vfio-pci/bind

# В libvirt: добавить VF в XML конфигурацию VM
# <hostdev mode='subsystem' type='pci' managed='yes'>
#   <source><address domain='0x0000' bus='0x01' slot='0x10' function='0x0'/></source>
# </hostdev>

Количество VF ограничено аппаратно: большинство серверных NIC Intel X710/E810 поддерживают до 128–256 VF на порт. Каждая VF потребляет BAR-пространство PCIe; при большом числе VF может потребоваться включить pci=realloc в параметрах ядра.

Частые вопросы

Можно ли использовать SR-IOV на обычном VPS?

Зависит от провайдера: гипервизор должен пробросить VF в гостевую VM, а не скрывать её за виртуальным коммутатором. Большинство публичных облаков предоставляют SR-IOV только на выделенных или bare-metal тарифах.

В чём разница между SR-IOV и PCI Passthrough?

PCI Passthrough отдаёт физическое устройство целиком одной VM — другие VM его использовать не могут. SR-IOV делит одно устройство на виртуальные функции, каждую из которых можно назначить отдельной VM, не теряя изоляции.

Какие NIC поддерживают SR-IOV?

Серверные адаптеры Intel X550, X710, E810, Mellanox ConnectX-4/5/6, Broadcom BCM57xx. Большинство потребительских карт (Intel I219, Realtek) SR-IOV не поддерживают.

Работает ли Live Migration с SR-IOV VF?

Нет — при стандартной конфигурации живая миграция невозможна, так как VF жёстко привязана к физическому порту. Для миграции нужно либо отключить VF перед переносом, либо использовать программный fallback на virtio.