PCIe SR-IOV 虚拟化详解
单根I/O虚拟化技术
什么是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
VF 1
VM 2
VF 2
VF 2
VM 3
VF 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虚拟化场景