看个框架图,有问题还是在群里或者评论区讨论
第一章 SR-IOV 产生背景
1.1 为什么需要 SR-IOV
在传统虚拟化环境中,虚拟机访问网卡、存储控制器等 PCIe 设备时通常需要经过 Hypervisor 转发。以网络设备为例,虚拟机发送的数据包首先进入虚拟网卡驱动,然后经过 VirtIO、vhost 或软件交换机,最后由宿主机物理网卡发送出去。整个过程中数据需要经过多次上下文切换、内存复制以及软件协议栈处理,这些额外开销在普通业务场景下问题不大,但对于高吞吐、低延迟业务而言会成为明显瓶颈。
随着云计算和数据中心规模不断扩大,越来越多应用开始要求接近物理机的网络性能。例如数据库集群、分布式存储、高频交易以及 HPC 计算环境,往往需要数十 Gbps 甚至数百 Gbps 网络带宽。传统 VirtIO 模式下,CPU 大量时间消耗在虚拟化转发路径中,而不是业务处理本身。为了解决这一问题,PCI-SIG 推出了 SR-IOV(Single Root I/O Virtualization)规范,允许单个物理 PCIe 设备直接向多个虚拟机提供独立硬件功能,从而减少 Hypervisor 干预并提升 I/O 性能。
1.2 SR-IOV 的核心思想
SR-IOV 的核心目标是让一个物理设备同时表现为多个独立 PCIe 设备。对于虚拟机而言,它看到的是一个真实 PCI 设备,可以直接加载驱动并访问硬件资源,而不需要经过 VirtIO 或软件模拟层。这样虚拟机与硬件之间建立了更加直接的数据通路,大幅降低虚拟化开销,传统虚拟化路径如下:
VM │ ▼VirtIO Driver │ ▼Hypervisor │ ▼Physical NIC
SR-IOV 路径:
VM │ ▼Virtual Function │ ▼Physical NIC
这里的数据路径明显缩短,CPU 参与度降低,因此网络延迟和吞吐量都能得到显著改善。这也是 SR-IOV 在云计算平台中被广泛采用的重要原因。
第二章 PF 与 VF 架构
2.1 什么是 Physical Function
SR-IOV 设备启动后,首先会出现一个 Physical Function(PF)。PF 是真实物理设备对应的 PCI 功能,拥有完整配置能力和管理权限。宿主机加载 PF 驱动后,可以配置设备参数、创建 VF、管理队列资源以及控制硬件运行状态。因此 PF 更像是整个设备的管理入口,以 Intel 网卡为例:
查看设备信息:lspci输出可能如下:
01:00.0 Ethernet controller:Intel XXV710
PF 驱动负责与硬件直接交互,同时为后续 VF 创建提供资源支持。没有 PF 的存在,VF 无法单独运行,因此 PF 是整个 SR-IOV 架构的核心管理节点。
2.2 什么是 Virtual Function
VF(Virtual Function)是 SR-IOV 创建出来的虚拟 PCI 功能。每个 VF 都拥有独立 PCI 配置空间、中断资源以及 DMA 能力,因此在操作系统看来就是一个真实 PCI 设备。
例如 PF 创建 8 个 VF:
echo 8 > /sys/class/net/eth0/device/sriov_numvfs
随后系统中可能出现:
01:00.1 VF001:00.2 VF101:00.3 VF2...01:00.8 VF7
这些 VF 可以分别分配给不同虚拟机使用。虽然它们共享同一块物理网卡,但每个 VF 都拥有独立 MAC 地址、队列和 DMA 通道,因此虚拟机能够直接访问硬件,而无需经过软件模拟层。
第三章 SR-IOV 硬件实现机制
3.1 PCIe 配置空间扩展
SR-IOV 并不是 Linux 特有功能,而是 PCIe 标准的一部分。支持 SR-IOV 的设备会在 PCIe Extended Capability 中提供专门的 SR-IOV Capability。操作系统通过读取该能力结构获取 VF 数量、VF BAR 地址以及资源映射信息,PCI 配置空间中包含如下信息:
SR-IOV Capability │ ├─ Total VFs ├─ Initial VFs ├─ VF Offset ├─ VF Stride └─ VF BAR
Linux PCI 子系统初始化设备时会解析这些配置项,从而确定设备是否支持 SR-IOV 以及能够创建多少个 VF。整个过程由 PCI 核心代码自动完成,驱动只需要实现对应回调接口即可。
3.2 VF 为什么能够直接 DMA
SR-IOV 性能提升的关键在于 VF 具备独立 DMA 能力。传统 VirtIO 模式下,DMA 操作由宿主机驱动完成;而 VF 被分配给虚拟机后,虚拟机驱动可以直接配置 DMA 描述符,数据无需经过 Hypervisor 中转,数据路径:
VM Memory │ ▼VF DMA Engine │ ▼NIC Hardware
为了保证安全性,系统通常配合 IOMMU 使用。IOMMU 会限制 VF 只能访问分配给当前虚拟机的内存区域,防止 DMA 越界访问其他虚拟机数据。因此 SR-IOV 能够实现高性能直通,同时保持虚拟化环境的隔离能力。
第四章 Linux 中的 SR-IOV 实现
4.1 PCI 子系统如何创建 VF
Linux PCI 核心提供了统一 SR-IOV 框架。当驱动调用 pci_enable_sriov() 时,PCI 子系统会根据设备 Capability 自动创建 VF,典型代码:
ret = pci_enable_sriov(pdev, num_vfs);
调用链大致:
Driver │ ▼pci_enable_sriov() │ ▼sriov_enable() │ ▼Create VF Devices
VF 创建完成后,每个 VF 都会作为独立 PCI 设备注册到系统中。此时可以通过 lspci 查看新增设备,并为其绑定驱动或分配给虚拟机。
4.2 sysfs 接口管理 VF
Linux 提供了统一 sysfs 接口管理 VF:
cat /sys/class/net/eth0/device/sriov_totalvfs
查看最大支持数量:64
创建 VF:echo 8 > /sys/class/net/eth0/device/sriov_numvfs
删除 VF:echo 0 > /sys/class/net/eth0/device/sriov_numvfs
这种设计使管理员无需修改驱动即可动态调整 VF 数量,非常适合云平台资源管理。OpenStack、Kubernetes SR-IOV Network Operator 等方案底层都依赖这些 sysfs 接口完成 VF 生命周期管理。
第五章 SR-IOV 与虚拟机直通
5.1 VF 如何分配给虚拟机
VF 创建后,通常会绑定 vfio-pci 驱动,再交给 QEMU 使用。绑定方式如下:
echo vfio-pci > /sys/bus/pci/devices/.../driver_override随后:virsh attach-device或者:qemu -device vfio-pci,...
此时 VF 会从宿主机解绑,并映射到目标虚拟机。对于虚拟机而言,这就是一个真实 PCI 网卡,因此可以直接加载厂商驱动进行使用,整个过程:
PF │ ├─ VF0 → VM1 ├─ VF1 → VM2 ├─ VF2 → VM3 └─ VF3 → VM4
多个虚拟机共享同一物理网卡,但互相隔离,各自拥有独立数据通路。
5.2 为什么 SR-IOV 性能接近裸机
VirtIO 路径中,大量 CPU 时间消耗在虚拟化层。而 SR-IOV 允许数据直接从虚拟机进入硬件队列,减少上下文切换和软件转发开销,性能路径对比:
VirtIO:VM ↓VirtIO ↓vhost ↓Bridge ↓NICSR-IOV:VM ↓VF ↓NIC
因此 SR-IOV 网络延迟通常比 VirtIO 更低,CPU 占用率也明显下降。在 25G、40G、100G 网络环境中,这种优势尤为明显,也是现代云计算平台大量采用 SR-IOV 的重要原因。
第六章 SR-IOV 的限制与应用场景
6.1 SR-IOV 的局限性
虽然 SR-IOV 性能优秀,但并非没有代价。首先,VF 数量受硬件限制,一块网卡通常只能提供几十到上百个 VF,无法像 VirtIO 那样无限扩展。其次,VF 一旦分配给虚拟机,宿主机难以对流量进行细粒度控制,软件交换机和安全策略能力受到影响。此外,Live Migration 迁移支持较差,因为 VF 与物理硬件绑定较深,迁移过程中状态同步非常复杂。
从运维角度来看,SR-IOV 还要求硬件支持 PCIe SR-IOV 和 IOMMU。如果 BIOS 未开启 VT-d 或 AMD-Vi,VF 无法安全直通。因此部署前需要检查硬件、固件以及内核配置是否满足要求。
6.2 应用
SR-IOV 最常见应用场景包括云计算、高性能存储以及低延迟网络服务。在 OpenStack 环境中,NFV(Network Function Virtualization)广泛使用 SR-IOV 为虚拟网络设备提供接近裸机的性能;在 Ceph、NVMe-oF 等存储系统中,SR-IOV 可以降低网络协议栈开销;在金融交易系统和 HPC 集群中,则能够减少网络延迟抖动,提高业务确定性。
从整体架构看,SR-IOV 本质上是在“共享设备”和“设备直通”之间寻找平衡。它既保留了一块设备服务多个虚拟机的能力,又提供接近 PCI Passthrough 的性能表现。随着 100G、200G 网络逐渐普及,SR-IOV 已成为现代数据中心网络虚拟化的重要基础技术之一。