SR-IOV浅浅理解

SR-IOV(Single Root I/O Virtualization) 单根I/O 虚拟化是 PCIe 设备级虚拟化,可以把它理解成:一块物理 PCIe 设备,在硬件层面“切”成多个几乎等同真设备的虚拟功能,直接分配给虚拟机使用。

一、先看模型

一块卡(PF)
 ├─ VF0  → VM0
 ├─ VF1  → VM1
 ├─ VF2  → VM2
 └─ VFn  → VMn

PF(Physical Function):真实物理功能;

VF(Virtual Function):硬件生成的“轻量 PCIe 设备”;

不是软件模拟,是设备硬件支持;

二、看原理

                ┌────────────────────────┐
PCIe Link  ───▶ │ PCIe Endpoint Controller│
                └───────────┬────────────┘
                            │
        ┌───────────────────┼────────────────────┐
        │                   │                    │
   ┌────▼────┐        ┌─────▼─────┐        ┌─────▼─────┐
   │   PF    │        │    VF0     │  ...   │    VF n   │
   │ (管理)  │        │ (数据面)  │        │ (数据面)  │
   └────┬────┘        └─────┬─────┘        └─────┬─────┘
        │                   │                    │
        │        ┌──────────▼──────────┐         │
        └──────▶ │   资源仲裁 / DMA /   │ ◀───────┘
                 │ Queue / MSI-X / IOMMU│
                 └──────────┬──────────┘
                            │
                        MAC / Engine

各模块含义

模块作用
PCIe Endpoint 统一链路、LTSSM
PF 管理功能(创建/销毁 VF)
VF VM 看到的“假独立设备”
DMA / Queue VF 间隔离
MSI-X 每个 VF 独立中断

VF 不是“复制一套硬件”,而是共享硬件资源;

三、配置空间角度

SR-IOV 是通过 PCIe 配置空间 实现的,不是引脚。

PCIe Config Space
 ├─ Type 0 Header
 ├─ MSI / MSI-X
 ├─ PCIe Capability
 ├─ Power Management
 └─ Extended Capability
     └─ SR-IOV Capability
         ├─ TotalVFs
         ├─ NumVFs
         ├─ VF BARs
         ├─ VF Offset

  当 PF 驱动写:

sriov_numvfs = 8

硬件内部:

  • 动态生成 8 个 VF

  • 分配 BDF

  • 映射 BAR

四、SR-IOV 解决了什么问题

1、传统虚拟化(慢)

VM → Virtio → Hypervisor → Host Driver → NIC

2、SR-IOV(快)

VM → VF Driver → NIC

结果:

  • 更低延迟

  • 更高吞吐

  • 更少 CPU 开销

网卡 / 存储卡 / 加速卡的主流方案

五、SR-IOV 的核心组成

1、PF(Physical Function)

  • 唯一

  • 负责:

    • 管理 VF

    • 资源分配

    • 配置空间

  • 只有 PF 驱动有“完全控制权”

2、VF(Virtual Function)

  • 多个(8 / 32 / 64 / 128…)

  • 每个:

    • 有独立 PCIe BDF

    • 有独立 BAR(精简版)

    • 可被直通给 VM

VF 无法做管理操作;

3、IOMMU(必须)

  • 地址隔离

  • DMA 重映射

  • 防止 VM 乱 DMA

六、SR-IOV 在 PCIe 层面发生了什么?

1、配置空间扩展

SR-IOV 是 PCIe Extended Capability

Extended Cap ID: SR-IOV (0x10)

2、设备枚举结果

0000:01:00.0  PF
0000:01:00.1  VF0
0000:01:00.2  VF1
...

  VF 是“动态生成”的;

七、Linux 下最常用操作

查看是否支持

lspci -vvv | grep -i sriov

查看最大 VF 数

cat /sys/bus/pci/devices/0000:01:00.0/sriov_totalvfs

创建 VF

echo 8 > sriov_numvfs

绑定 VF 给 VM

  • vfio-pci:PCIe 设备从 Host 手里接走,并安全交给 VM 使用”的内核驱动。vfio-pci 是唯一一个同时理解 PCIe,又理解 虚拟化,又能安全使用 DMA的通用驱动。

PCIe 设备(PF / VF)
        ↓
   vfio-pci  ←── 核心
        ↓
     IOMMU
        ↓
     QEMU / KVM
        ↓
        VM
  • passthrough隔离host,决定vf给vm如何分配;

硬件能力:SR-IOV
      ↓
设备形态:PF / VF
      ↓
内核机制:vfio + IOMMU
      ↓
虚拟化方式:Passthrough
      ↓
VM 里看到:真实 PCIe 设备

  

八、工程中最容易踩的坑(非常重要)

1、开 SR-IOV 后掉性能

原因:

  • VF 数过多

  • PF 资源调度不合理

  • 中断风暴(MSI-X)

2、 VF 建链 / 掉链异常

  • ASPM / L1.2 打开

  • VF 电源管理不完整

服务器场景强烈建议关 ASPM

3、热插拔 / 热重置失败

  • VF 依赖 PF

  • PF reset 会把 VF 全杀

这是 SR-IOV 设计决定的;

九、SR-IOV vs 相关技术

技术区别
SR-IOV 单 RC,多 VF
MR-IOV 多 RC(很少见)
Virtio 纯软件
PCIe PASID DMA 维度虚拟化
ATS 地址翻译加速

 

 

posted @ 2026-01-07 15:38  骑白马的猴子  阅读(2)  评论(0)    收藏  举报