news 2026/10/1 8:21:00

SR-IOV 中的 VF(Virtual Function)详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
SR-IOV 中的 VF(Virtual Function)详解

目录

一、总体理解

二、VF 的底层原理

1. PCIe Function 是什么

2. VF 是如何创建出来的

三、“有与性能相关的资源”是什么意思

1. 队列资源

2. 描述符环

3. MSI-X 中断

4. BAR 和寄存器窗口

5. 硬件上下文

6. 资源不一定物理独占

独立或专属资源

配额化资源

共享资源

四、“可独立 DMA”的原理

1. 基本 DMA 路径

2. 为什么 VF 可以被 IOMMU 区分

3. IOMMU 的重要性

4. “独立 DMA”不等于“独立 DMA 硬件”

逻辑独立

物理独立

五、“无设备初始化/配置能力”如何理解

1. VF 不能做的全局操作

安全原因

硬件架构原因

2. VF 通常可以做的本地配置

3. PF-VF Mailbox

六、完整生命周期和工作流程

阶段 1:PF 初始化物理设备

阶段 2:PF 创建 VF

阶段 3:宿主机设置 VF 策略

阶段 4:VF 分配给虚拟机或容器

虚拟机直通

容器使用 VF

阶段 5:VF 驱动初始化本地数据通路

阶段 6:数据面独立运行

阶段 7:复位和回收

七、数据面与控制面的关系

八、典型应用场景

1. 虚拟机网络直通

2. DPDK 和 NFV

3. 容器网络

4. RDMA

5. 存储设备

6. GPU、加速卡和智能网卡

九、性能分析

1. 性能优势

缩短 I/O 路径

支持硬件卸载

支持多队列并行

2. 性能不一定等于物理设备独占

3. NUMA 影响

十、隔离与安全分析

1. 内存隔离

2. 网络身份隔离

3. 资源型拒绝服务

4. 共享故障域

十一、可管理性分析

1. 优点

2. 缺点

十二、VF 与 Virtio 的对比

十三、常见误区

误区 1:VF 是一块独立的物理设备

误区 2:VF 可以访问任意内存

误区 3:VF 完全不能配置

误区 4:VF DMA 必须经过 PF

误区 5:VF 一定拥有独立 DMA 引擎

误区 6:VF 性能一定等于 PF

十四、一个完整示例

控制流程

发送流程

特权配置流程

十五、最终总结

1. 轻量 PCIe Function

2. 数据面资源

3. 受控独立 DMA

4. 管理能力受限


一、总体理解

SR-IOV(Single Root I/O Virtualization)允许一个物理 PCIe 设备暴露出多个 PCIe Function:

  • PF(Physical Function):完整功能,负责设备初始化、资源管理和 VF 生命周期管理;
  • VF(Virtual Function):轻量级功能,主要负责高速数据通路。

可以概括为:

PF 负责控制面和管理面,VF 负责数据面。

VF 通常具有:

  • 独立 PCIe BDF;
  • 有限的 PCI 配置空间;
  • VF BAR;
  • 队列和描述符资源;
  • MSI-X 中断;
  • DMA 请求能力;
  • 独立的硬件上下文。

但 VF 通常不具有:

  • 物理设备上电初始化能力;
  • 固件加载能力;
  • 全局寄存器访问能力;
  • PHY、端口、链路配置能力;
  • 全局队列和共享缓存分配能力;
  • 创建或销毁其他 VF 的能力;
  • 整个设备的复位能力。

因此,原描述更准确地说是:

VF 拥有被 PF 分配的数据面资源,可以基于自己的队列和 PCIe Requester ID 独立发起受控 DMA;但不能初始化整个物理设备,也不能修改设备级全局配置。VF 只能进行有限的本地配置,或者通过 mailbox 请求 PF 代为执行特权操作。


二、VF 的底层原理

1. PCIe Function 是什么

PCIe 通过 BDF 标识一个 Function:

Bus : Device . Function

例如:

0000:3b:00.0 PF 0000:3b:02.0 VF0 0000:3b:02.1 VF1 0000:3b:02.2 VF2

启用 SR-IOV 后,系统会把每个 VF 枚举成独立的 PCIe Function。因此,从操作系统或虚拟机的角度看,VF 很像一块独立设备:

  • 有自己的 PCI Device ID;
  • 可以绑定自己的驱动;
  • 可以映射 BAR;
  • 可以注册 MSI-X;
  • 可以成为 DMA Bus Master;
  • 可以通过 VFIO 直通给虚拟机。

但 VF 并不对应一套完整的物理硬件。它通常只是设备内部的一组:

  • 队列;
  • 寄存器窗口;
  • 中断向量;
  • DMA 上下文;
  • 过滤规则;
  • 调度上下文;
  • 统计信息;
  • 权限标识。

底层的物理端口、PCIe 链路、缓存、DMA 引擎和处理流水线往往仍然是共享的。


2. VF 是如何创建出来的

支持 SR-IOV 的 PF 在 PCIe 配置空间中包含 SR-IOV Extended Capability,其中会描述:

  • TotalVFs:设备最多支持多少个 VF;
  • NumVFs:当前启用多少个 VF;
  • First VF Offset:第一个 VF 与 PF 的路由位置关系;
  • VF Stride:不同 VF 之间的 Function 间隔;
  • VF Device ID:VF 使用的设备 ID;
  • VF BAR:VF 的 BAR 资源;
  • 支持的页大小等。

PF 驱动初始化设备后,可以设置NumVFs并使能 VF。随后 PCIe 子系统根据这些信息枚举出 VF。

Linux 中常见操作为:

echo 8 > /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs

表示通过该 PF 创建 8 个 VF。

销毁 VF:

echo 0 > /sys/bus/pci/devices/0000:3b:00.0/sriov_numvfs

VF 不能自行创建其他 VF,也不能决定自己使用多少全局资源,这些权限属于 PF。


三、“有与性能相关的资源”是什么意思

VF 的主要设计目标是:让虚拟机或容器能够绕过复杂的软件转发路径,直接使用设备的数据通路。

以网卡 VF 为例,PF 可能为每个 VF 分配:

VF0 ├─ Rx Queue 0~3 ├─ Tx Queue 0~3 ├─ Completion Queue ├─ MSI-X Vector ├─ MAC/VLAN Filter ├─ Queue Context └─ DMA/调度上下文

常见资源包括:

1. 队列资源

例如:

  • Tx Queue;
  • Rx Queue;
  • Submission Queue;
  • Completion Queue;
  • Work Queue;
  • Event Queue。

队列通常是 VF 高性能数据路径的核心。


2. 描述符环

驱动在内存中建立描述符环,例如:

Tx Descriptor Ring: +------+---------+--------+ | Addr | Length | Flags | +------+---------+--------+

描述符包含:

  • 数据缓冲区地址;
  • 长度;
  • 校验和或分段卸载参数;
  • 完成标志;
  • 所有权状态。

VF 读取描述符后执行 DMA。


3. MSI-X 中断

每个 VF 通常拥有一个或多个 MSI-X 向量,用于:

  • 收包完成通知;
  • 发包完成通知;
  • 错误事件;
  • 队列事件。

中断可以直接送达宿主机或虚拟机对应的 vCPU。

高负载场景下也可能使用轮询,例如:

  • NAPI;
  • DPDK Poll Mode Driver;
  • RDMA Completion Polling。

4. BAR 和寄存器窗口

VF 可以拥有自己的 VF BAR,驱动通过该区域访问:

  • 队列控制寄存器;
  • Doorbell;
  • 中断控制;
  • 本地状态;
  • mailbox 寄存器;
  • VF 复位状态。

VF BAR 通常只是设备整体 MMIO 空间中的受限窗口。VF 无法通过它访问 PF 的全局管理寄存器。


5. 硬件上下文

设备通常根据 VF ID 或 PCIe Requester ID 维护独立上下文,例如:

  • 队列属于哪个 VF;
  • VF 允许使用哪些 DMA 地址;
  • VF 的 MAC/VLAN;
  • VF 速率限制;
  • VF 能访问哪些内部对象;
  • VF 能否修改某些参数;
  • VF 是否处于 trusted 模式。

这些上下文构成 VF 间隔离的基础。


6. 资源不一定物理独占

“VF 有独立资源”并不一定意味着每个 VF 拥有完全独立的物理 DMA 引擎。

实际设备中通常分为三类:

独立或专属资源

  • 队列编号;
  • 队列上下文;
  • MSI-X 向量;
  • VF 寄存器窗口;
  • 过滤规则;
  • 统计计数器。

配额化资源

  • 队列数量;
  • 带宽;
  • 流表项;
  • 缓存额度;
  • RDMA QP 数量;
  • Completion Queue 数量。

共享资源

  • 物理端口;
  • PCIe 链路;
  • 内部交换结构;
  • DMA 引擎;
  • 片上缓存;
  • 外部内存带宽;
  • 固件;
  • 物理链路带宽。

所以 VF 的性能可以接近物理设备,但多个 VF 之间仍然可能出现资源竞争。


四、“可独立 DMA”的原理

1. 基本 DMA 路径

以网卡发送数据为例:

Guest Driver │ │ 1. 在内存中准备数据和描述符 ▼ Guest Memory / DMA Buffer │ │ 2. 写 VF Doorbell ▼ VF Queue Context │ │ 3. 设备发起 PCIe DMA Read ▼ IOMMU 地址检查和转换 │ │ 4. 读取允许访问的内存 ▼ NIC Packet Processing │ │ 5. 从物理端口发送 ▼ Network

接收方向:

Network │ ▼ Physical NIC │ │ 根据 MAC/VLAN/Flow Rule 分类 ▼ VF Rx Queue │ │ DMA Write ▼ IOMMU │ ▼ Guest DMA Buffer │ ▼ MSI-X / Polling

数据收发过程中,PF 一般不需要逐包参与。

这就是 VF 性能高的重要原因:

  • 不需要每个数据包都经过宿主机软件交换;
  • 减少虚拟化陷入;
  • 减少上下文切换;
  • 减少软件复制;
  • 降低时延和 CPU 开销。

2. 为什么 VF 可以被 IOMMU 区分

每个 VF 通常有自己的 PCIe BDF,也就有独立的 PCIe Requester ID。

设备发起 DMA 时,事务中带有对应的 Requester ID。IOMMU 根据 Requester ID 查找该 VF 的地址转换和访问权限:

VF Requester ID │ ▼ IOMMU Context │ ├─ 允许访问 Guest Page A ├─ 允许访问 Guest Page B └─ 禁止访问 Host/Other Guest Memory

所以“独立 DMA”更准确的含义是:

VF 可以不经过 PF 软件逐次代理,自主发起属于该 VF 的 DMA 请求;但 DMA 访问范围由 IOMMU、宿主机和设备权限共同限制。

它不意味着 VF 可以访问任意物理内存。


3. IOMMU 的重要性

如果没有正确配置 IOMMU,一个直通设备理论上可能通过 DMA 访问不属于自己的内存,造成:

  • 宿主机内存破坏;
  • 跨虚拟机数据泄漏;
  • 权限提升;
  • 系统崩溃。

因此,VF 直通通常配合:

  • Intel VT-d;
  • AMD-Vi;
  • ARM SMMU;
  • VFIO/IOMMU Group;
  • Interrupt Remapping。

使用。


4. “独立 DMA”不等于“独立 DMA 硬件”

需要区分:

逻辑独立

  • VF 有自己的队列;
  • VF 可以写自己的 doorbell;
  • DMA 请求带有自己的身份;
  • DMA 完成送到自己的中断;
  • PF 不参与每次请求。

物理独立

  • 每个 VF 有独占 DMA 引擎;
  • 有独占缓存;
  • 有独占总线;
  • 有独占物理端口。

大部分 SR-IOV 设备只保证前者,不保证后者。


五、“无设备初始化/配置能力”如何理解

这个说法是相对 PF 而言,不能简单理解为“VF 完全不能配置”。

1. VF 不能做的全局操作

通常包括:

  • 设备上电初始化;
  • 固件加载和升级;
  • 物理链路训练;
  • PHY 初始化;
  • 物理端口速率设置;
  • 全局队列资源划分;
  • 全局缓存划分;
  • 创建或删除 VF;
  • 管理其他 VF;
  • 修改 SR-IOV 全局配置;
  • 访问整个设备的寄存器空间;
  • 执行设备级复位;
  • 修改整个端口的流控模式;
  • 修改共享调度器;
  • 管理设备安全策略。

原因主要有两个:

安全原因

如果某个 VF 能修改全局配置,它可能影响:

  • PF;
  • 其他 VF;
  • 其他虚拟机;
  • 整个物理端口;
  • 整台服务器。

硬件架构原因

VF 本质上只有受限寄存器和资源窗口,并没有映射完整的设备控制寄存器。


2. VF 通常可以做的本地配置

VF 驱动通常仍然需要进行本地初始化,例如:

  • 分配并设置描述符环;
  • 设置队列地址;
  • 设置队列深度;
  • 配置自己的 MSI-X;
  • 开启或停止自己的队列;
  • 写自己的 doorbell;
  • 设置中断合并参数;
  • 查询链路状态;
  • 申请部分卸载能力;
  • 执行 VF 级别复位。

所以更准确的表述是:

VF 没有完整的物理设备初始化和全局配置能力,但具有有限的 VF 本地初始化能力。


3. PF-VF Mailbox

VF 需要执行特权操作时,通常通过 mailbox 向 PF 请求。

例如:

VF Driver PF Driver/Firmware │ │ │ Request: 设置 MAC 地址 │ ├─────────────────────────────────►│ │ │ 检查 VF 权限和策略 │ │ 配置硬件过滤表 │ Response: Success/Denied │ ◄─────────────────────────────────┤

常见 mailbox 操作包括:

  • 查询 API 或协议版本;
  • 查询链路状态;
  • 请求队列资源;
  • 请求设置 MAC;
  • 请求设置 VLAN;
  • 请求启用校验和卸载;
  • 请求设置 MTU;
  • 请求重置 VF;
  • 获取设备能力;
  • 获取错误状态。

PF 可以根据安全策略拒绝请求。

例如宿主机管理员预先指定:

ip link set eth0 vf 0 mac 52:54:00:12:34:56 ip link set eth0 vf 0 vlan 100 ip link set eth0 vf 0 spoofchk on ip link set eth0 vf 0 max_tx_rate 5000

这种情况下,虚拟机内的 VF 驱动不能随意修改这些属性。


六、完整生命周期和工作流程

阶段 1:PF 初始化物理设备

系统启动后,PF 驱动完成:

  1. PCIe 设备识别;
  2. BAR 映射;
  3. 固件加载;
  4. 全局寄存器初始化;
  5. DMA 引擎初始化;
  6. PHY 和链路初始化;
  7. 中断系统初始化;
  8. 全局队列、缓存和调度器配置;
  9. SR-IOV 能力检查。

此时物理设备已经能够正常工作。


阶段 2:PF 创建 VF

管理员或虚拟化管理平台请求启用若干 VF:

Administrator │ ▼ PF Driver │ ├─ 设置 NumVFs ├─ 为 VF 分配队列 ├─ 创建 VF 上下文 ├─ 设置 VF BAR 资源 ├─ 设置中断资源 └─ 设置安全和带宽策略

系统随后枚举出多个 VF。


阶段 3:宿主机设置 VF 策略

PF 或宿主机可以设置:

  • MAC 地址;
  • VLAN;
  • 带宽上限;
  • spoof check;
  • trust 模式;
  • 是否允许混杂模式;
  • 队列数量;
  • QoS;
  • 流量导向规则。

这些配置构成 VF 的安全边界。


阶段 4:VF 分配给虚拟机或容器

虚拟机直通

典型流程:

  1. 将 VF 从宿主机 VF 驱动解绑;
  2. 绑定到vfio-pci;
  3. 建立 IOMMU 映射;
  4. 将 VF 的配置空间、BAR 和中断映射给虚拟机;
  5. 虚拟机加载厂商 VF 驱动。

结构如下:

+---------------- Virtual Machine ----------------+ | Guest Application | | │ | | Guest VF Driver | | │ MMIO / DMA / MSI-X | +--------┼-----------------------------------------+ │ VFIO │ IOMMU │ +--------▼-----------------------------------------+ | VF Queue / Context | | Physical Device | +--------------------------------------------------+

容器使用 VF

容器通常不会直接管理 PCIe 生命周期,而是通过:

  • SR-IOV CNI;
  • Kubernetes Device Plugin;
  • Network Attachment Definition;
  • VFIO 或 VF netdevice;

将 VF 暴露给 Pod。


阶段 5:VF 驱动初始化本地数据通路

虚拟机中的 VF 驱动通常执行:

  1. 读取 VF 配置空间;
  2. 映射 VF BAR;
  3. 与 PF 协商 mailbox 版本;
  4. 查询允许使用的能力;
  5. 分配 DMA 内存;
  6. 创建 Tx/Rx 队列;
  7. 设置描述符环地址;
  8. 配置 MSI-X;
  9. 启动本地队列;
  10. 开始收发数据。

注意:这是 VF 的本地初始化,不是物理设备的全局初始化。


阶段 6:数据面独立运行

发送时:

应用 → Guest Network Stack/DPDK → VF Tx Descriptor → 写 Doorbell → 设备 DMA 读取数据 → 硬件调度 → 物理端口发送

接收时:

物理端口收包 → 硬件分类 → 定位目标 VF → DMA 写入 VF 缓冲区 → MSI-X 或轮询 → Guest Driver → 应用

PF 不需要逐包复制或转发。


阶段 7:复位和回收

VF 可能支持 FLR(Function Level Reset),用于重置单个 VF:

  • 停止 VF 队列;
  • 清理未完成 DMA;
  • 清空 VF 上下文;
  • 恢复 VF 默认状态;
  • 尽量不影响其他 VF。

但 VF 通常不能执行:

  • PF Reset;
  • Secondary Bus Reset;
  • 全设备复位;
  • 物理链路复位。

虚拟机关闭后,宿主机通常会:

  1. 停止 VF DMA;
  2. 撤销 IOMMU 映射;
  3. 执行 VF FLR;
  4. 清除安全上下文;
  5. 将 VF 重新绑定给宿主机或分配给其他虚拟机。

七、数据面与控制面的关系

可以用下图理解:

控制面 +----------------+ | PF Driver | | Firmware | | Hypervisor | +--------+-------+ | 配置 MAC/VLAN/QoS/队列/权限/资源 | +---------------------------▼--------------------------+ | Physical Device | | | | VF0 Context VF1 Context VF2 Context | | Queue/IRQ/DMA Queue/IRQ/DMA Queue/IRQ/DMA | | | | | | +-------|-----------------|-----------------|-----------+ | | | Guest 0 Guest 1 Container \ | / \________________|________________/ | 数据面

关键点是:

  • 控制面仍由 PF 掌握;
  • 数据面可以由 VF 直接操作;
  • PF 不必参与每一次数据传输;
  • PF 仍负责资源、安全、生命周期和异常处理。

八、典型应用场景

1. 虚拟机网络直通

这是最常见的场景。

传统虚拟网络路径可能是:

Guest → Virtio → vhost → Linux Bridge/OVS → Host NIC

SR-IOV VF 路径则更短:

Guest VF Driver → VF Queue → Physical NIC

适合:

  • 云计算高性能网络;
  • 数据库虚拟机;
  • 高频交易;
  • 实时通信;
  • 网络功能虚拟化;
  • 高吞吐存储网络。

2. DPDK 和 NFV

在 DPDK 场景中,应用可以轮询 VF 队列:

DPDK Application │ Poll Mode Driver │ VF Queue │ NIC Hardware

它可以减少:

  • 内核协议栈开销;
  • 中断开销;
  • 上下文切换;
  • 数据复制。

常用于:

  • 虚拟防火墙;
  • vRouter;
  • 5G UPF;
  • 负载均衡;
  • DPI;
  • 虚拟基站网络功能。

3. 容器网络

Kubernetes 中可通过 SR-IOV CNI 将 VF 分配给 Pod。

适合:

  • 低时延 Pod;
  • 电信云;
  • 高吞吐网络应用;
  • 需要 RDMA 的容器;
  • 需要硬件卸载的网络功能。

限制是 VF 数量有限,调度器还需要考虑:

  • PCIe 拓扑;
  • NUMA;
  • VF 数量;
  • 驱动兼容性;
  • 设备健康状态。

4. RDMA

支持 SR-IOV 的 RDMA 网卡可以为 VF 提供:

  • QP;
  • CQ;
  • Doorbell;
  • Memory Region;
  • Completion Event;
  • 受限的 RDMA 资源。

应用可以获得较低时延和较低 CPU 消耗。

需要注意:

  • MR 注册和内存权限仍然需要严格控制;
  • PF 负责全局资源限制;
  • 不同设备的 VF RDMA 能力差异很大。

5. 存储设备

部分 NVMe、FC、SAS 或智能存储控制器支持 SR-IOV。

VF 可能表现为一个虚拟控制器,拥有:

  • Submission Queue;
  • Completion Queue;
  • Namespace 或逻辑卷访问权限;
  • MSI-X;
  • DMA 上下文。

适用于:

  • 虚拟化数据库;
  • 高 IOPS 存储;
  • NVMe 直通;
  • 软件定义存储;
  • 虚拟机低时延块设备。

6. GPU、加速卡和智能网卡

部分 GPU、FPGA、压缩卡、密码卡和 SmartNIC 也可能使用 SR-IOV。

VF 可以被分配:

  • 计算队列;
  • 命令队列;
  • 部分计算单元;
  • 上下文;
  • 内存窗口;
  • DMA 通道;
  • 中断。

但 GPU 虚拟化不一定采用标准 SR-IOV,也可能使用:

  • mediated device;
  • 厂商 vGPU;
  • Scalable Function;
  • PASID/SVA;
  • 时间片复用。

因此不能把所有虚拟加速设备都直接等同于 VF。


九、性能分析

1. 性能优势

VF 能提升性能的主要原因是:

缩短 I/O 路径

绕过或减少:

  • 虚拟交换机;
  • 宿主机协议栈;
  • 软件设备模拟;
  • 数据包复制;
  • VM Exit;
  • 额外调度。

支持硬件卸载

例如:

  • checksum offload;
  • TSO/GSO;
  • RSS;
  • VLAN offload;
  • 流分类;
  • 加密卸载;
  • RDMA;
  • 存储命令处理。

支持多队列并行

多个 vCPU 可以对应多个队列:

vCPU0 → Queue0 vCPU1 → Queue1 vCPU2 → Queue2 vCPU3 → Queue3

有利于提升吞吐和多核扩展能力。


2. 性能不一定等于物理设备独占

VF 的性能仍可能受以下因素限制:

  • 多个 VF 共享物理端口;
  • PCIe 带宽有限;
  • DMA 引擎共享;
  • 片上缓存竞争;
  • 内存带宽竞争;
  • NUMA 跨节点访问;
  • IOMMU 转换开销;
  • 中断配置不合理;
  • 队列数量不足;
  • PF 配置的限速;
  • 固件调度策略;
  • 其他 VF 的突发流量。

例如,一块 100 Gbit/s 网卡创建 16 个 VF,并不意味着每个 VF 都能同时获得 100 Gbit/s。


3. NUMA 影响

如果 VF 位于 NUMA Node 0,而虚拟机内存和 vCPU 位于 NUMA Node 1,则 DMA 和 CPU 访问可能跨 NUMA:

VF/NIC on NUMA 0 │ │ Inter-Socket Link ▼ Guest Memory on NUMA 1

这会增加:

  • 内存访问时延;
  • 跨 Socket 流量;
  • CPU 消耗;
  • 抖动。

高性能部署应尽量做到:

  • VF;
  • 虚拟机内存;
  • vCPU;
  • 中断;
  • HugePage;

位于同一 NUMA 节点。


十、隔离与安全分析

1. 内存隔离

主要依赖:

  • IOMMU;
  • VF Requester ID;
  • VFIO;
  • DMA 映射;
  • 设备内部权限检查。

如果 VF、IOMMU 或设备固件存在缺陷,可能造成 DMA 越权风险。


2. 网络身份隔离

PF 通常需要限制 VF:

  • MAC 地址伪造;
  • VLAN 越权;
  • 混杂模式;
  • 广播风暴;
  • 非法流表操作;
  • 随意修改带宽策略。

常见机制包括:

  • spoof checking;
  • trusted/untrusted VF;
  • MAC locking;
  • VLAN filtering;
  • rate limiting;
  • ACL;
  • eSwitch 策略。

3. 资源型拒绝服务

即使 DMA 内存隔离正确,一个恶意 VF 仍可能通过大量操作争抢共享资源,例如:

  • 高频 doorbell;
  • 中断风暴;
  • 队列占满;
  • 大量小包;
  • 消耗流表项;
  • 占用缓存;
  • 触发固件异常;
  • 消耗共享链路带宽。

因此需要:

  • 队列配额;
  • 中断限制;
  • 带宽限速;
  • 流表配额;
  • 固件看门狗;
  • VF 错误隔离;
  • PF 侧健康监控。

4. 共享故障域

虽然 VF 在逻辑上独立,但它们共享同一物理设备和固件。

下列问题可能影响所有 VF:

  • PF 复位;
  • 固件崩溃;
  • PCIe 链路故障;
  • 物理端口断链;
  • 设备过热;
  • 驱动升级;
  • 全局资源耗尽。

所以:

VF 提供的是较强的数据路径隔离,但并不等同于完全独立的物理设备。


十一、可管理性分析

1. 优点

  • 接近裸机的 I/O 性能;
  • 时延低;
  • CPU 开销小;
  • 虚拟机直接使用硬件队列;
  • 硬件卸载能力较强;
  • 多租户可共享一个物理设备;
  • 数据面不需要 PF 逐次介入。

2. 缺点

  • VF 数量受硬件限制;
  • 队列和中断资源有限;
  • 配置依赖 PF 和厂商驱动;
  • 直通后宿主机可观测性降低;
  • 虚拟机热迁移更困难;
  • 设备复位和升级可能影响多个租户;
  • 不同型号 VF 能力差异较大;
  • 虚拟交换、ACL、抓包和监控可能更复杂;
  • 对 NUMA、IOMMU 和中断亲和性较敏感。

十二、VF 与 Virtio 的对比

对比项SR-IOV VFVirtio/vhost
数据路径直接进入硬件队列通常经过宿主机后端
性能通常更高较高,但有软件路径
时延通常更低通常略高
CPU 开销较低相对更高
隔离机制IOMMU + 设备硬件Hypervisor + 软件后端
热迁移较困难通常更容易
可观测性相对较弱宿主机更容易观测
灵活策略依赖硬件能力软件策略更灵活
硬件依赖强相对较弱
VF 数量受设备限制通常更灵活

因此:

  • 强调性能和低时延时,倾向 VF;
  • 强调迁移、灵活性和统一管理时,倾向 Virtio/vhost;
  • 部分平台会采用混合方案,例如高性能流量走 VF,管理流量走 Virtio。

十三、常见误区

误区 1:VF 是一块独立的物理设备

不是。VF 是一个独立可枚举的 PCIe Function,但其底层通常共享:

  • 物理端口;
  • PCIe 链路;
  • DMA 引擎;
  • 缓存;
  • 固件;
  • 调度器。

误区 2:VF 可以访问任意内存

不能。VF 的 DMA 应受到 IOMMU 和宿主机映射限制。


误区 3:VF 完全不能配置

不准确。VF 可以配置自己的局部数据路径,例如队列、描述符和中断;但不能控制物理设备的全局状态。


误区 4:VF DMA 必须经过 PF

通常不需要。数据面 DMA 可由 VF 自主发起,PF 主要负责前期配置、权限管理和异常处理。


误区 5:VF 一定拥有独立 DMA 引擎

不一定。VF 通常有逻辑独立的 DMA 上下文,但底层 DMA 引擎可能共享。


误区 6:VF 性能一定等于 PF

不一定。VF 可能受到:

  • 队列数限制;
  • 功能限制;
  • 带宽限制;
  • 共享资源竞争;
  • IOMMU;
  • NUMA;
  • 固件调度;

等因素影响。


十四、一个完整示例

假设一块 100G 网卡支持 64 个 VF,管理员创建 8 个 VF,并将 VF0 分配给 VM1。

控制流程

1. PF 驱动加载网卡固件 2. PF 初始化物理端口和全局资源 3. PF 创建 8 个 VF 4. PF 为 VF0 分配 4 个 Rx 队列、4 个 Tx 队列 5. 宿主机设置 VF0 的 MAC、VLAN、限速 6. VF0 绑定 vfio-pci 7. IOMMU 为 VF0 建立 VM1 的 DMA 地址映射 8. VF0 直通给 VM1 9. VM1 加载 VF 驱动 10. VF 驱动建立描述符环和 MSI-X

发送流程

VM1 应用生成数据 ↓ VF 驱动填写 Tx 描述符 ↓ VF 驱动写 Doorbell ↓ 网卡根据 VF0 上下文读取描述符 ↓ IOMMU 验证并转换 DMA 地址 ↓ 网卡 DMA 读取 VM1 内存 ↓ 网卡执行校验和/分段等卸载 ↓ 通过物理端口发包

特权配置流程

如果 VM1 想修改 MAC:

VF Driver ↓ mailbox request PF Driver ↓ 检查管理员策略 允许:写入硬件过滤表 拒绝:返回 permission denied

整个数据面无需 PF 逐包转发,但资源、安全和全局配置仍然由 PF 控制。


十五、最终总结

VF 可以从四个关键词理解:

1. 轻量 PCIe Function

VF 有独立 BDF、BAR、驱动、中断和 DMA 身份,可被操作系统或虚拟机当作设备使用。

2. 数据面资源

VF 拥有或被分配队列、描述符、中断和硬件上下文,重点解决高吞吐和低时延问题。

3. 受控独立 DMA

VF 可以不经过 PF 逐次代理直接发起 DMA,但 DMA 地址范围受到 IOMMU、VFIO 和设备内部权限约束。

4. 管理能力受限

VF 可以初始化自己的局部队列和数据通路,但不能初始化整个物理设备、修改全局配置或管理其他 VF。特权操作通常需要通过 mailbox 请求 PF。

最精炼的描述是:

VF 是 PF 创建并管理的轻量级 PCIe 功能。它拥有独立的数据面队列、DMA 上下文和中断能力,能够直接完成高性能 I/O;但它只拥有有限的本地配置权限,设备初始化、物理链路、全局资源、安全策略和 VF 生命周期均由 PF、固件或 Hypervisor 管理。

SR-IOV 中的 PF(Physical Function)详解-CSDN博客

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/1 8:21:00

实例创建中的显卡数量字段:配置入口与性能结论分离

创建 GPU 实例时,如果页面允许选择“显卡数量”,很容易产生一个直觉: 既然可以选 2 张、4 张甚至更多 GPU,是不是就代表这些多卡配置能够直接使用,而且数量越多性能越高? 这个推论不能直接成立。 “显卡数量…

作者头像 李华
网站建设 2026/10/1 8:20:45

STAROps 主机智能巡检:给你的 ECS 请个 24 小时在线的 AI 医生

又是凌晨三点,一通告警电话把你从床上拽起来。你睡眼惺忪地连上跳板机,一台台机器 top、dmesg、iostat 敲下去,两个小时过去,天都快亮了,才发现是一块网卡在悄悄丢包。如果这一幕你也不陌生,那这篇文章&…

作者头像 李华
网站建设 2026/10/1 8:20:05

手机旗舰混战,拼高端的小米与用户离心?

2026年,存储芯片价格失控,上游成本压力传导至下游终端,智能手机行业内卷加剧,消费者的购机门槛也随之抬高。市场环境的变化,推高了消费者手机焕新的“冲动阈值”。而就在短短十日之内,四大国产手机品牌vivo…

作者头像 李华
网站建设 2026/10/1 8:18:35

融级数字底座工程化实践:分布式核心、AI模型工厂与信创适配架构解析

一、金融机构核心系统转型的技术挑战金融机构核心系统正在经历从集中式主机架构向分布式架构的迁移。这一转型涉及三个层面的技术挑战:分布式架构的工程化落地。 银行核心业务系统需要从大型主机下移,迁移至云原生分布式架构。这不仅是技术栈的替换&…

作者头像 李华
网站建设 2026/10/1 8:17:16

React与Vue现代前端架构演进全景纵横:从设计哲学到未来范式

React与Vue现代前端架构演进全景纵横:从设计哲学到未来范式在 2026 年现代前端技术演进的全景版图上,React 19 与 Vue 3.5 共同构筑了全球前端工程最坚实的两大顶梁柱。 然而,尽管它们在表层 API(React Hooks vs Vue Composables&…

作者头像 李华