Определение простыми словами
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.