SR-IOV:一张实体网卡怎样变成多个可分配给虚拟机的设备?

TL;DR

SR-IOV 允许支持该能力的 PCIe 设备由物理功能创建多个虚拟功能,供不同工作负载更直接地使用。本文解释 PF/VF 分工、性能价值,以及为什么硬件虚拟化本身不等于完整隔离。

SR-IOV 允许支持该能力的 PCIe 设备由物理功能创建多个虚拟功能,供不同工作负载更直接地使用。本文解释 PF/VF 分工、性能价值,以及为什么硬件虚拟化本身不等于完整隔离。

SR-IOV:一张实体网卡怎样变成多个可分配给虚拟机的设备?

云服务器上,一张实体网卡往往要服务多台虚拟机。最简单的方式是让虚拟机经过宿主机的软件交换层,但这会增加 CPU 参与和数据转发开销。SR-IOV(Single Root I/O Virtualization,单根 I/O 虚拟化)是一种 PCI Express 能力,让一个实体设备向系统呈现多个可分配的虚拟功能。

支持 SR-IOV 的设备通常有一个物理功能(PF),由宿主机管理;PF 可以创建多个虚拟功能(VF)。每个 VF 会像一个独立的 PCI 设备那样出现在系统中,可以分配给虚拟机或容器化环境中的工作负载。网卡设备由此能让数据路径更直接,减少传统虚拟网络转发环节,改善高吞吐、低延迟场景的效率。

可以把 PF 想成一台总交换机,VF 则像它分出来的若干专用端口。管理员负责创建、配置和分配这些端口;虚拟机拿到 VF 后,操作系统能直接与设备队列交互。具体能配置多少 VF、每个 VF 能使用哪些队列与功能,由设备和驱动决定,并非任何网卡都能无限拆分。

“虚拟功能”也不等于“自动安全隔离”。设备本身通常会提供队列和功能划分,IOMMU 则在 DMA(设备直接内存访问)层面约束设备能访问的物理内存范围。平台配置、固件、驱动和管理软件都必须正确工作,才能建立可靠边界。如果 DMA 映射或设备分配出了问题,一个 VF 的访问可能影响其他工作负载。

此外,VF 直通通常会牺牲部分灵活性:虚拟机迁移、快照、设备共享和统一网络策略可能比使用纯软件虚拟网卡复杂。管理系统需要安排设备归属,故障排查也得区分宿主机驱动、PF 管理与 VF 内部状态。因此,SR-IOV 常用于对网络性能要求高、并且可以接受设备绑定限制的业务,而不是所有虚拟机的默认选项。

SR-IOV 的意义,是把一部分设备虚拟化能力放入网卡等硬件,让多个工作负载可以更直接地使用设备资源。判断是否适合时,要同时看性能收益、IOMMU 隔离、迁移需求和运维复杂度。它不是把一块网卡变成多块完全独立的实体网卡,而是通过 PF/VF 模型把硬件能力安全地分配出去。

来源:Linux 内核文档:PCI Express I/O Virtualization Howto

KEEP READING