在 ICT 行业,不断提高硬件资源的使用效率是技术发展路线中亘古不变的主旋律。虚拟化作为其中最为主要的解决方式之一,其带来的影响早已不言而喻。而今天我们要说的,正是虚拟化中一项非常重要的技术 —— SR-IOV,也是下一代高端企业级存储设备不可或缺的重要功能。
SR-IOV 全称“Single Root I/O Virtualization”,简单说,它可以将单一的 PCIe 设备虚拟为多个功能设备并分配给不同的虚拟机直接访问使用,借此有效提升每一个虚拟机获得的 I/O 性能并降低延迟。要想进一步了解 SR-IOV 的神奇之处,我们需要先来了解一下常规硬件平台的构成:
从上图可以看到,系统镜像 System Image(简称“SI”)的运行建立在各种硬件资源之上,如 CPU、系统内存、PCIe 树等。PCIe 树又以 Root Complex(简称“RC”)为根,通过 Root Port 连接 PCIe 设备或者 PCIe Switch,Switch 又是一个扇出结构,可以连接多个 PCIe设备。
单一系统镜像对于硬件资源的使用,其效率往往是比较低的。为了提高硬件资源的使用率,我们可以在上图的基础上增加一个虚拟化中间层 Virtualization Intermediary(简称“VI”),它是虚拟机的管理层,是物理机和虚拟机的中介,VI 可以是 hypervisor,也可以是 VMM,它可以为多个 SI 的运行提供支持,架构如下图所示:
显然,这样做可以极大提高硬件资源的利用效率,并在一些场景下良好运行。但是,当 I/O 访问压力较高,其性能下降也会比较明显 —— 每一笔 I/O 都要经过 VI 的转译和处理,VI 自身的执行效率也就很容易成为整个系统的性能瓶颈。于是,SR-IOV 应运而生。
SR-IOV 的思路是,通过将 PCIe 设备虚拟为多个 Function(Virtual Function,简称“VF”),再经过一些地址转换或管理机制(如 SR-PCIM、TA、ATPT 等),供不同 SI 直接访问使用,这样 I/O 操作就不再需要经过 VI 去转译了。
- PF:Physical Function,物理功能,一个 PF 对应一项 PCIe 物理功能,可以被物理主机发现和管理。它支持 SR-IOV Extended Capability 并可由 SR-PCIM、VI 或 SI 访问。
- VF:Virtual Function,虚拟功能,一个 VF 就是一个轻量级的 PCIe Function, 可以由 SI 直接访问;一个 PCIe Device 可以虚拟为多个 VF 并同时为不同的 SI 提供服务,无需增加硬件投入。
- SR-PCIM:Single Root PCI Manager,这是一个管理软件,用于配置 SR-IOV Extended Capability 寄存器,管理 PF 和VF 等。
SR-IOV 通过将 PF 分为多个 VF 为上层虚拟机使用,相当于虚拟机绕过 VI 直接使用 PCIe 设备处理 I/O 和传输数据。
至于 TA(Translation Agent)、ATS(Address Translation Services)、ATPT(Address Translation and Protection Table)、ATC(Address Translation Cache)、ACS(Access Control Service)等模块,都是可选的,也都是和地址访问有关的功能,在这些功能的互相配合下,让整个虚拟化方案更加健壮。不过,由于这些都是可选功能,受篇幅限制,本文不做展开。
既然 SR-IOV 可以提供的好处有这么多,在实际业务应用中,该如何配置和使用?让我们继续往下看。
设置 SR-IOV
SR-IOV 需要主机端和设备端相互配合才行,所以我们需要:
- 一台支持 SR-IOV 的主机
- 一个支持 SR-IOV 的 PCIe 设备,如,忆恒创源最新发布的 PBlaze7 7940 就支持该功能,并可以提供多达32个VF。
在主机侧,我们要确保 CPU 支持虚拟化,加载 vfio,使能 IOMMU 等。另外,我们要在 BIOS 中使能 ARI Support,如图所示:
ARI 是 SR-IOV 中很重要的技术,它的全称是 Alternative Routing-ID Interpretation。从下图中可以看到,没有 ARI 时,16-bit 的 ID 由 8-bit Bus Number、5-bit Device Number 和 3-bit Function Number 组成,而应用的 ARI 之后,Device Number 的 bit 位被 Function Number 占用了,此时 16-bit 的 ID 由 8-bit Bus Number 和 8-bit Function Number 组成。这样做的好处是显而易见的:ARI Device 最高可以支持256个 Function,而 Non-ARI Device 只能最高支持8个。为什么 Device Number 可以被占用呢?这是因为 Device Number 主要是用在共享总线架构中的,比如 PCI 总线。而在点对点架构中,比如像 PCIe 架构下,Device Number 通常是用不到的。
做完主机端设置,我们移步 PBlaze7 7940 SSD 的 SR-IOV 设置,通过配置 SR-IOV Extended Capability 寄存器实现。
首先,我们通过 lspci 命令查看 SR-IOV Extended Capability 寄存器状态,此时可以看到 VF 数量为0。
然后,我们向 SR-IOV Extended Capability 寄存器中的 NumVFs 写 3,即设定 3 个 VF。此时,我们再通过 lspci 命令查看 SR-IOV Extended Capability 寄存器,确认 NumVFs 设置成功。
现在,我们可以看到多了3个 PCI 设备。下图红框中为 VF,蓝框为 PF。
不过,要使 VF 真正能够工作,我们还需要使用 Virtualization Management 命令配置控制器资源。PF 对应的是 Primary Controller,VF 对应的是 Secondary Controllers。具体需要设置的部分为控制器的 Virtual Queue Resource(VQ Resource)和 Virtual Interrupt Resource(VI Resource),前者负责管理队列的控制器资源,后者负责管理中断向量的控制器资源。下图为 VF1(位于01:00.01)的最终配置情况,红框部分为 VQ Resource配置,蓝框部分为 VI Resource 配置,绿框部分则是将该 controller 设置为 online。
此时查看控制器资源,可以看到资源已经配置成功。
接下来就是给各个 VF 创建 Namespace 的环节了,相信大家对这一步都已经非常熟悉,不多做介绍。我们使用的 SSD 为 PBlaze7 7940 的 3.84TB 容量点,在创建 VF 之前,PV 上的 Namespace 显示为 3.84TB。为了给 VF 也能创建 Namespace,我们重新分配了容量,如下图所示:
PV 上的 Namespace 是 /dev/nvme0n1,其它3个 VF 上的 Namespace 分别是 /dev/nvme2n2,/dev/nvme3n3,/dev/nvme4n4。这4个 Namespace 的容量都设定为 800GB。
最后,我们将每一个 VF 分别挂到一个虚拟机上,就可以实现每个系统镜像对单独的 VF 进行直接访问啦。
SR-IOV 实测
在刚刚结束的美国 FMS2023 闪存峰会上,我们对 PBlaze7 7940 SSD 的 SR-IOV 功能进行了实时演示,通过设定4个不同容量的 VF 并将它们挂载到4个虚拟机当中。
PBlaze7 7940 SSD 支持 VF 性能配额管理,实现不同 VF 之间的性能隔离,避免因某一个虚拟机访问压力突然增加对其它虚拟机业务性能造成影响。在演示过程中,我们将4个 VF 的 Namespace 性能分别限制为 800MB/s、1200MB/s、1600MB/s 和 2400MB/s,从实测结果来看,每一个虚拟机获得的最终读性能可完美匹配我们预先设定好的带宽限制。
PBlaze7 7940 系列 PCIe 5.0 企业级 NVMe SSD
PBlaze7 7940 是忆恒创源(Memblaze)面向新 AI 技术应用、虚拟化、云计算等高性能部署使用场景打造的全新一代 PCIe 5.0 企业级 SSD。采用长江存储晶栈Xtacking X3 NAND,与目前主流的 PCIe 4.0 SSD 相比,PBlaze7 7940 有着高达1.5倍以上的性能提升,4K 随机读性能 2800K IOPS,顺序读写带宽分别达到 14GB/s 和 10GB/s,即使和同类 PCIe 5.0 SSD 相比也能保持领先。
它采用最新的硬件设计,在公司自主 MemSpeed 5.0 技术合集的深度优化下,硬件效率被进一步发挥,并带来更低的功耗与发热,优化的散热设计,也使其更加适合于数据中心密集型部署。PBlaze7 7940提供U.2、E1.S、E3.S、HHHL AIC四种产品形态,3.2TB-15.36TB容量点,全方位满足不同企业客户的部署使用需求。