SR-IOV 与 PCI 直通是什么
两者都是把物理 PCIe 设备交给虚机直接使用,绕过宿主软件交换路径,从而获得更低的延迟与更高的吞吐。PCI 直通把一整块设备分给一台虚机;SR-IOV 则在物理功能(PF)之上切出多个虚拟功能(VF),一块网卡可以同时给多台虚机使用。代价也一样:设备不跟随虚机热迁移,宿主侧可观测性下降,排障难度上升。
基本信息
| 适用平台 | 支持 VT-d(Intel)或 AMD-Vi 的服务器与主流 Linux 发行版 |
|---|---|
| SR-IOV | PF 负责管理,多个 VF 直通给不同虚机,单卡多虚机共享 |
| PCI 直通 | 整设备分配给一台虚机,通常用 vfio-pci 驱动绑定 |
| 前置条件 | BIOS 开启 IOMMU,内核开启对应选项,设备与固件支持 |
| 常见代价 | 热迁移受限、宿主侧抓包与监控能力下降 |
| 典型用途 | 高吞吐网络、低延迟场景、GPU 或专用加速卡 |
典型使用场景
- 高吞吐网络场景:普通虚拟交换成为瓶颈时改用 VF 直通
- 低延迟要求:对时延敏感的中间件或转发类业务
- GPU 或专用加速卡:训练与推理需要独占设备
- DPDK 类应用:需要绕过内核协议栈直接访问网卡
- 性能对比验证:在同样的虚机规格下比较直通与虚拟交换的差异
- 存储控制器直通:需要直接管理物理盘或磁带设备的场景
检查宿主是否具备条件
检查宿主是否具备条件
dmesg | grep -i -e DMAR -e IOMMU | head # 确认 IOMMU 已启用并被内核识别
ls /sys/kernel/iommu_groups/ | sort -n | tail -5 # 存在 IOMMU 分组,说明设备可隔离
lspci -nn | grep -i ethernet # 找到目标网卡的 PCI 地址与厂商型号
lspci -s 0000:3b:00.0 -vvv | grep -i -A2 'Single Root' # 查看是否支持 SR-IOV 能力
ls /sys/class/net/*/device/physfn 2>/dev/null # 判断某网卡是否为 VF 及其所属 PF
ip -br link | grep -E 'vf|pf' # 查看 VF 对应接口的命名与状态两种方案对照
| 对比项 | PCI 直通 | SR-IOV |
|---|---|---|
| 设备粒度 | 整块设备给一台虚机 | 一块设备切多个 VF 分给多台虚机 |
| 资源利用率 | 低,设备独占 | 高,多虚机共享同一物理设备 |
| 热迁移 | 不支持,需先解除直通 | 同样受限,VF 不跟随迁移 |
| 宿主可观测性 | 宿主看不到该设备的流量 | PF 侧可观察,但 VF 流量同样绕过软件交换 |
| 故障影响面 | 只影响一台虚机 | 共享设备的配置失误可能影响多台虚机 |
| 典型场景 | GPU、专用卡、存储控制器 | 高吞吐网卡、DPDK |
启用直通前先在 BIOS 打开 IOMMU,并确认设备处于独立的 IOMMU 分组:分组不独立时无法安全地单独分配给虚机。
直通设备不参与热迁移:把这类虚机纳入变更计划前先确认迁移策略,否则维护窗口执行迁移会直接失败。