什么是SR-IOV?

SR-IOV(Single Root I/O Virtualization,单根I/O虚拟化)是PCIe的一项标准扩展,允许单个物理PCIe设备在硬件层面虚拟出多个虚拟设备,每个虚拟设备可以直接分配给不同的虚拟机使用。

为什么需要SR-IOV?

  • 性能提升:虚拟机直接访问硬件,绕过Hypervisor软件层
  • 降低延迟:减少I/O虚拟化带来的额外开销
  • 提高吞吐量:接近物理机的I/O性能
  • 节省资源:多个虚拟机共享一个物理设备

I/O虚拟化技术对比

技术 实现方式 性能 隔离性 适用场景
软件模拟 Hypervisor模拟设备 兼容性测试
Para-virtualization 前端/后端驱动 通用虚拟化
设备直通(PCIe Passthrough) 整个设备分配给VM 单VM独占设备
SR-IOV 硬件虚拟化 多VM共享设备

PF和VF详解

SR-IOV定义了两种Function类型:Physical Function(PF)Virtual Function(VF)

Physical Function (PF)

物理功能

PF是完整的PCIe Function,拥有完整的配置空间和管理能力。

主要能力

  • 完整的配置空间访问
  • VF的创建和配置
  • 设备全局资源管理
  • 错误处理和恢复
  • 支持所有PCIe能力

典型用途

  • Hypervisor/Host管理
  • VF生命周期管理
  • 设备监控和诊断

Virtual Function (VF)

虚拟功能

VF是轻量级的PCIe Function,由PF创建,用于分配给虚拟机。

主要特点

  • 轻量级配置空间
  • 独立的I/O资源
  • 独立的MSI/MSI-X中断
  • 共享物理设备资源
  • 无全局管理能力

典型用途

  • 分配给虚拟机
  • 容器I/O加速
  • 多租户隔离

PF与VF对比

特性 PF VF
配置空间大小 完整(256B/4KB) 精简(部分寄存器)
BAR数量 6个 通常2-4个
VF创建能力 支持 不支持
中断数量 完整 受限
错误处理 完整 仅本地错误
DMA能力 支持 支持(IOMMU隔离)

SR-IOV系统架构

SR-IOV拓扑结构

Host/Hypervisor
PF Driver
SR-IOV Device
PF
VF 1
VF 2
VF 3
VF n
VM 1
VF 1
VM 2
VF 2
VM 3
VF 3

SR-IOV配置空间

SR-IOV扩展了PCIe配置空间,增加了SR-IOV Capability结构。

SR-IOV Capability寄存器

寄存器 偏移 功能
SR-IOV Capabilities 0x00 SR-IOV能力标志
SR-IOV Control 0x04 VF使能/禁用控制
SR-IOV Status 0x06 VF状态
InitialVFs 0x08 设备支持的VF数量
TotalVFs 0x0A 可配置的VF总数
NumVFs 0x0C 当前配置的VF数量
Function Dependency Link 0x0E Function依赖关系
VF Offset 0x10 第一个VF的Function号偏移
VF Stride 0x12 相邻VF的Function号间隔
VF Device ID 0x14 VF的设备ID
VF BAR0-5 0x18-0x2C VF的基地址寄存器

SR-IOV配置流程

VF创建流程

1
检测SR-IOV能力 读取SR-IOV Capability,获取支持的VF数量
2
配置VF数量 写入NumVFs寄存器,设置要创建的VF数量
3
使能VF 设置VF Enable位,硬件创建VF
4
配置VF资源 为每个VF分配内存、中断等资源
5
分配VF给VM 将VF直通给虚拟机使用

Linux SR-IOV配置示例

# 1. 查看设备是否支持SR-IOV
$ lspci -s 03:00.0 -vvv | grep -i sriov
	Capabilities: [160] Single Root I/O Virtualization (SR-IOV)
		IOVCap: Migration-, Interrupt Message Number: 000
		IOVCtl: Enable- Migration- Interrupt- MSE- ARIHierarchy-
		IOVSta: Migration-
		Initial VFs: 64, Total VFs: 64, Number of VFs: 0

# 2. 查看当前VF数量
$ cat /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs
0

# 3. 创建4个VF
$ echo 4 | sudo tee /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs

# 4. 查看创建的VF
$ lspci | grep Virtual
03:00.1 Ethernet controller: Intel Corporation Virtual Function
03:00.2 Ethernet controller: Intel Corporation Virtual Function
03:00.3 Ethernet controller: Intel Corporation Virtual Function
03:00.4 Ethernet controller: Intel Corporation Virtual Function

# 5. 查看VF详细信息
$ lspci -s 03:00.1 -vvv

# 6. 删除VF(设置为0)
$ echo 0 | sudo tee /sys/bus/pci/devices/0000:03:00.0/sriov_numvfs
                    

KVM虚拟机使用VF

# 1. 解绑VF from host driver
$ echo 0000:03:00.1 | sudo tee /sys/bus/pci/drivers/ixgbevf/unbind

# 2. 绑定VF to vfio-pci(用于直通)
$ echo vfio-pci | sudo tee /sys/bus/pci/devices/0000:03:00.1/driver_override
$ echo 0000:03:00.1 | sudo tee /sys/bus/pci/drivers/vfio-pci/bind

# 3. 查看VF的IOMMU组
$ readlink /sys/bus/pci/devices/0000:03:00.1/iommu_group
../../../../../../kernel/iommu_groups/16

# 4. 启动虚拟机时附加VF
$ qemu-system-x86_64 \
    -device vfio-pci,host=03:00.1,id=net0 \
    ...

# 或使用libvirt
$ virsh attach-device vm1 vf.xml
                    

ACS与SR-IOV的配合

ACS(Access Control Services)是SR-IOV安全隔离的重要保障,确保VF之间的隔离性。

为什么需要ACS?

安全风险

在没有ACS的情况下,恶意VM可能通过VF:

  • 访问其他VF的内存空间
  • 发起针对其他VM的DMA攻击
  • 通过P2P事务绕过IOMMU

ACS保护机制

Source Validation

验证TLP的源地址,防止伪造源地址攻击

P2P Request Redirect

将P2P请求重定向到RC,由IOMMU进行地址转换

Translation Blocking

阻止未授权的地址转换请求

SR-IOV安全架构

IOMMU
ACS (Switch/RC)
VF 1
VF 2
VF 3
VM 1
VM 2
VM 3

Linux ACS配置

# 查看设备的ACS能力
$ lspci -vvv -s 00:01.0 | grep -A 10 "Access Control Services"

# 强制启用ACS(某些情况下需要)
$ echo 1 | sudo tee /sys/bus/pci/devices/0000:00:01.0/acs_enable

# 检查IOMMU是否启用
$ dmesg | grep -i iommu
[    0.000000] Command line: ... intel_iommu=on iommu=pt ...

# 查看IOMMU组
$ find /sys/kernel/iommu_groups/ -type l
                    

SR-IOV性能优化

中断优化

MSI-X优化

  • 为每个VF分配足够的中断向量
  • 使用多队列网卡(RSS/RPS)
  • 中断亲和性绑定(IRQ affinity)

内存优化

  • 使用大页内存(HugePages)
  • NUMA亲和性配置
  • 避免跨节点内存访问

CPU优化

  • CPU pinning(vCPU绑定物理核)
  • 隔离专用CPU核心
  • 禁用超线程(如有必要)

性能测试

# 测试VF网络性能(使用iperf3)
# Host端
$ iperf3 -s

# VM端(通过VF)
$ iperf3 -c  -t 30 -P 4

# 对比:使用virtio-net
$ iperf3 -c  -t 30 -P 4

# 查看VF统计
$ ethtool -S eth0

# 查看中断分布
$ cat /proc/interrupts | grep eth0
                    

SR-IOV应用场景

NFV/电信云

虚拟化网络功能,高性能数据面处理

  • vRouter/vFirewall
  • 虚拟负载均衡
  • DPI/流量分析

云数据库

高性能存储访问,低延迟I/O

  • NVMe SSD虚拟化
  • 高并发数据库
  • 内存数据库

公有云

多租户I/O隔离,性能保障

  • 裸金属服务
  • 高性能计算实例
  • GPU虚拟化

边缘计算

资源受限环境下的高效虚拟化

  • 边缘网关
  • 工业控制
  • 5G MEC

总结

SR-IOV是PCIe虚拟化的核心技术,通过硬件层面的I/O虚拟化,实现了接近物理机的I/O性能。结合ACS和IOMMU,SR-IOV提供了安全、高效的I/O虚拟化解决方案。

关键要点

  • SR-IOV通过PF和VF实现硬件虚拟化
  • PF负责管理,VF分配给虚拟机使用
  • ACS确保VF之间的安全隔离
  • IOMMU提供DMA重映射和保护
  • SR-IOV适用于高性能I/O虚拟化场景

参考资源