一、为什么虚拟化需要 SR-IOV

在传统虚拟化架构里,虚拟机的每个网络包都要经过 Guest OS → 虚拟网卡(virtio)→ Hypervisor vSwitch → 物理网卡 四层软件栈,仅 vSwitch 层就要吃掉 20-30% 的宿主机 CPU,并增加 30-50μs 延迟。

当虚拟机需要跑 NFV、金融交易、数据库同步、AI 推理服务 这类对网络敏感的业务时,这层软件开销就是性能天花板。

二、SR-IOV 的核心原理

PF(Physical Function)—— 完整的网卡

Physical Function 是网卡的"完整身份",拥有全部配置权限、DMA 引擎、中断资源、SR-IOV 管理接口。PF 由 Host OS 或 Hypervisor 掌管,负责启用/禁用 SR-IOV、创建/销毁 VF、下发 MAC/VLAN 配置。

VF(Virtual Function)—— 网卡切片

Virtual Function 是从 PF 派生的"轻量分身",每张 EZMAX NETI710 网卡:

  • NETI710-2CP(Intel X710-BM2,双口):每端口 64 VF,整卡 128 VF
  • NETI710-4CP(Intel XL710-BM1,四口):每端口 64 VF,整卡 256 VF

每个 VF 都拥有独立的 PCIe 配置空间、独立的 DMA 队列、独立的 MAC 地址。虚拟机把 VF 通过 PCI Passthrough 直接接管后,网络流量完全绕过 Hypervisor 软件栈,直接由网卡硬件在 VM 内存和物理链路之间搬运。

DMA 直通的加速原理

SR-IOV 加速效果的本质来自三点:

  1. IOMMU 内存映射:Intel VT-d / AMD-Vi 硬件把 VM 的 GPA 映射到网卡可访问的 IOVA,DMA 引擎直读 VM 内存;
  2. MSI-X 中断直投:网卡中断直接投递到 VM 的 vCPU,无需 Hypervisor 转发;
  3. 硬件 L2 交换:VF 与 VF 之间的流量走网卡内部的 embedded switch(VEB),不上物理链路也不进 vSwitch。

三、在 Linux 上启用 SR-IOV

1. BIOS 与内核前置准备

# 步骤 1:BIOS 里打开 Intel VT-d 或 AMD-Vi(IOMMU)
# 步骤 2:修改 GRUB 内核参数
sudo vim /etc/default/grub
# 找到 GRUB_CMDLINE_LINUX,追加:
# intel_iommu=on iommu=pt
sudo update-grub && sudo reboot

2. 加载驱动并启用 VF

# 查看网卡型号,确认支持 SR-IOV
lspci | grep Ethernet
ethtool -i eth0
# 启用 8 个 VF(NETI710-2CP 单口最多 64 个)
echo 8 | sudo tee /sys/class/net/eth0/device/sriov_numvfs
# 验证 VF 已创建
lspci | grep "Virtual Function"
ip link show eth0

3. 设置 VF 的 MAC 与 VLAN(推荐)

sudo ip link set eth0 vf 0 mac 52:54:00:11:22:33
sudo ip link set eth0 vf 0 vlan 100
sudo ip link set eth0 vf 0 spoofchk on
sudo ip link set eth0 vf 0 trust off

4. 把 VF 透传给虚拟机

# virsh XML 片段
<interface type="hostdev" managed="yes">
<source>
<address type="pci" domain="0x0000" bus="0x03" slot="0x02" function="0x0"/>
</source>
</interface>
# 或 QEMU 命令行
-device vfio-pci,host=03:02.0

四、在 VMware ESXi 上启用 SR-IOV

  1. vCenter → 主机 → 配置 → 硬件 → PCI 设备,找到 EZMAX 网卡,点启用 SR-IOV
  2. 设置最大 VF 数(NETI710-4CP 建议 32),重启主机;
  3. VM 编辑设置 → 添加 PCI 设备 → 选择目标 VF;
  4. VM 内存必须预留(Reserve all guest memory),否则无法启动。

五、性能实测

测试环境:Intel Xeon Gold 6338 + 128GB DDR4 + EZMAX NETI710-2CP,对端同型号,10G 直连。

指标virtio 软件虚拟化SR-IOV 直通提升
iperf3 TCP 吞吐6.8 Gbps9.85 Gbps+45%
UDP 小包 PPS(64B)1.2 Mpps14.5 Mpps+1108%
Ping 平均延迟85 μs18 μs-79%
VM 侧 CPU 占用65%15%-77%

六、常见坑与调优建议

  • 坑 1:VM 迁移不支持——SR-IOV 直通的 VF 无法热迁移,建议使用 bond + failover 模式;
  • 坑 2:VF 数量不够——单张 4 口卡 256 个 VF,如果单机跑 300 个 VM 就得插两张;
  • 坑 3:广播风暴——VEB 内交换不做 STP,同 VLAN VF 间要开 spoofchk;
  • 调优:给 VF 绑定 NUMA 亲和性的 vCPU,性能再提升 10-15%。

小结:SR-IOV 已经是企业级虚拟化平台的准入门槛。EZMAX NETI710 系列基于 Intel X710/XL710 芯片,双口 128 VF、四口 256 VF 的规格足以覆盖绝大多数虚拟化场景。搭配 IOMMU + MSI-X 硬件路径,能让虚拟机网络性能无限接近物理裸机。