浅谈 NVMe over Fabrics (NVMe-oF) 协议

核心作用:打破物理限制,扩展高性能存储访问

NVMe-oF 的核心目标是将原本只能在服务器本地通过高速 PCIe 总线访问的超高性能 NVMe SSD 存储,通过网络(Fabric)扩展到其他服务器或客户端,实现高性能、低延迟、大规模的存储资源共享和池化。它解决了传统存储协议(如 iSCSI, FC-SCSI)在利用新型 NVMe SSD 时存在的瓶颈问题。

关键作用总结

  1. 突破本地限制: 使远程服务器能够以接近本地访问的性能(低延迟、高吞吐量)访问集中部署的 NVMe SSD 存储资源。

  2. 实现存储解耦与池化: 将昂贵的 NVMe SSD 从单个服务器中解放出来,集中部署在存储阵列或 JBOF(Just a Bunch Of Flash)中,形成高性能存储池,供多个计算节点按需共享。

  3. 大幅提升性能: 相比传统基于 SCSI 的 SAN 协议(iSCSI, FC),NVMe-oF 显著降低了访问延迟(从毫秒级降到微秒级),提高了吞吐量和 IOPS(每秒输入/输出操作数),更能充分发挥 NVMe SSD 的潜力。

  4. 提高资源利用率: 集中化的高性能 NVMe 存储池可以被多个计算节点灵活共享,避免每个服务器都配置大量本地 NVMe SSD 导致的资源浪费和管理复杂性问题。

  5. 简化存储架构: 为高性能工作负载(如 AI/ML 训练、高性能数据库、实时分析、金融交易)提供统一的高性能网络存储访问方式。

  6. 支持现代应用需求: 满足云原生、容器化、微服务架构对高性能、可扩展、弹性存储的需求。

底层逻辑:继承 NVMe 效率,适配网络传输

NVMe-oF 的成功在于其设计哲学:尽可能保留本地 NVMe 协议的高效性,同时最小化为适应网络传输(Fabric)而引入的开销。

核心逻辑分解

  1. 基于原生 NVMe 模型:

NVMe-oF 直接复用本地 NVMe 协议的核心命令集(如读写、管理命令)、队列机制(Submission Queue/SQ 和 Completion Queue/CQ)和 Doorbell 寄存器概念。

关键优势: 避免了 SCSI 命令集和协议栈的转换开销(SCSI 是为传统机械硬盘设计的,协议栈复杂)。NVMe 命令天生就是为并行、低开销的 SSD 访问设计的。

  1. 引入传输层(Transport Layer):

这是 NVMe-oF 的核心创新。它定义了如何将 NVMe 的 SQ、CQ 和命令/响应数据包封装在特定的网络传输协议之上。

逻辑抽象: 它将 NVMe 控制器、命名空间、队列等概念映射到网络上的资源。主机(Initiator)通过网络连接到目标(Target)上的"控制器"。

  1. 支持多种传输层(Fabrics):

NVMe-oF 规范定义了多种传输层实现,以适应不同的网络基础设施:

NVMe over RDMA (NVMe/RDMA): 利用 RDMA 技术实现内存零拷贝和绕过操作系统内核的直接数据访问,是性能最高的方案。底层支持:

RoCE (RDMA over Converged Ethernet): 在标准以太网上运行 RDMA,需要支持 RoCE 的网卡(RNIC)和交换机(通常需要 PFC+ECN 等无损网络特性)。

iWARP: 另一种在 TCP/IP 上实现 RDMA 的协议。

InfiniBand: 原生支持 RDMA 的高性能网络。

NVMe over Fibre Channel (NVMe/FC): 利用现有的 FC 网络基础设施,将 NVMe 命令/数据封装在 FC 帧中传输。保护现有 FC 投资,并向高性能演进。

NVMe over TCP (NVMe/TCP): 使用标准的 TCP/IP 网络。兼容性最好(无需专用网卡或FC交换机),部署最简单,成本最低。通过内核或用户空间优化(如 SPDK)可以取得不错的性能,但延迟和CPU开销通常高于 RDMA 方案。

  1. 高效的数据传输机制:

SQ/CQ 共享与优化: 一个连接(Connection)上可以建立多个 SQ/CQ 对,支持多线程并行访问。

命令/响应结构紧凑: NVMe 命令本身就很精简。

In-capsule Data vs. SGL: 小数据量命令可以直接内嵌在命令包中传输;大数据量传输使用高效的散点/聚集列表在 Initiator 和 Target 内存之间建立直接映射,结合 RDMA 实现零拷贝(或 TCP 实现高效拷贝)。

端到端流控: 协议自身定义了高效的流控机制。

  1. 低开销的协议处理:

避免协议转换: 彻底消除 SCSI 协议栈转换(SCSI Command Descriptor Block -> NVMe Command Translation)是大幅降低延迟的关键。

用户态驱动: 常结合 SPDK、DPDK 等技术实现用户态的 NVMe-oF Initiator/Target,绕过内核协议栈,进一步降低延迟和 CPU 开销(尤其对于 NVMe/TCP 和 NVMe/RDMA)。

逻辑流程图简化示意:

应用程序\] -\> \[主机文件系统 (如 ext4, XFS)\] -\> \[主机块层\] -\> \[NVMe-oF Initiator 驱动

|

(通过网络 Fabric: RDMA/FC/TCP) 传输 原生 NVMe 命令/数据包

|

NVMe-oF Target 软件 (在存储设备端)\] -\> \[Target 端 NVMe 驱动\] -\> \[物理 NVMe SSD

案例详细说明

案例一:AI/ML 训练平台的高性能共享存储

场景: 一家公司运行大型 AI 模型训练任务。训练数据集巨大(数百TB甚至PB级),需要被多个 GPU 服务器节点高速访问(高吞吐量、低延迟 IO)。每个 GPU 节点本身配备高性能 NVMe SSD 用于临时存储或缓存,但主数据集需要集中、共享、可扩展的存储。

传统方案痛点:

使用 NFS 或基于 iSCSI/FC 的 SAN:协议开销太大,无法充分利用 NVMe SSD 性能,成为训练瓶颈,导致 GPU 空闲等待数据。

每个节点复制一份完整数据集:浪费存储空间,数据同步困难且缓慢。

NVMe-oF 解决方案:

架构:

  1. 部署一个集中式的高性能全闪存存储阵列或 JBOF,内部装满 NVMe SSD。

  2. 该存储系统支持 NVMe over RoCE 作为 Target。

  3. 所有 GPU 计算节点配备支持 RoCE v2 (或更高) 的 25/100/200 GbE 网卡(RNIC)。

  4. 部署无损以太网网络(交换机支持 PFC, ECN),连接所有计算节点和存储。

  5. 在 GPU 节点上安装 NVMe/RDMA Initiator 驱动 (如 Linux 内核原生驱动或优化过的用户态驱动)。

运作:

  1. 数据集存储在中央 NVMe 存储池中。

  2. GPU 节点上的训练框架(如 TensorFlow, PyTorch)通过标准文件 API 访问共享存储。

  3. 文件请求经过内核 VFS/块层后,被 NVMe/RDMA Initiator 驱动拦截。

  4. Initiator 将文件 IO 请求转化为原生的 NVMe 命令(读写)。

  5. 这些 NVMe 命令和数据通过 RoCE 网络直接传输到存储 Target。

  6. 存储 Target 的 NVMe/RDMA 软件栈接收命令,访问后端 NVMe SSD,完成操作。

  7. 结果(数据或完成状态)通过 RoCE 网络直接返回给 Initiator。

效果:

GPU 节点能以接近本地 SSD 的延迟(~100 μs 级别)和极高的吞吐量(多个节点叠加可达数十GB/s甚至更高) 访问共享数据集。

避免了 GPU 因 IO 等待而空闲,极大缩短了模型训练时间。

存储资源利用率高,不同训练任务可以共享同一份数据源。

存储容量和性能可以独立扩展(加SSD或加存储节点)。

案例二:企业核心数据库的高可用与性能提升

场景: 一个金融机构的核心交易数据库(如 Oracle RAC, MySQL Cluster)运行在双活(Active-Active)或高可用(HA)集群上,要求极高的 IOPS 和极低延迟,并且需要共享存储以实现数据库实例的快速故障切换。

传统方案痛点:

使用 FC-SAN 或 iSCSI-SAN:存储协议开销(SCSI 转换、协议栈)限制了性能上限,尤其是在随机小 IO(OLTP 场景)时延迟较高(通常在毫秒级)。

本地 NVMe SSD:无法在服务器间共享,无法满足高可用性要求(主节点故障,备节点无法立即访问其存储)。

NVMe-oF 解决方案 (采用 FC 基础设施演进):

架构:

  1. 现有成熟的 FC SAN 网络基础设施(32G/64G FC 交换机、HBA 卡)。

  2. 升级存储阵列,使其支持 NVMe over Fibre Channel (NVMe/FC) Target。

  3. 数据库服务器更换支持 NVMe/FC 的 HBA 卡(或确保现有 FC HBA 的驱动/固件支持 NVMe/FC)。

  4. 在数据库服务器上安装 NVMe/FC Initiator 驱动。

  5. 数据库集群配置(如 Oracle RAC)指向新的 NVMe/FC LUN。

运作:

  1. 数据库实例的 IO 请求被传递给 NVMe/FC Initiator 驱动。

  2. Initiator 将请求转化为原生 NVMe 命令。

  3. NVMe 命令和数据被封装在标准的 FC 帧中(符合 FCP-NVMe 标准)。

  4. 通过 FC 网络传输到存储阵列。

  5. 存储阵列的 NVMe/FC Target 接收 FC 帧,解封装出 NVMe 命令,访问后端 NVMe SSD。

  6. 结果(数据或完成状态)封装回 FC 帧,返回给 Initiator。

效果:

显著降低数据库 IO 延迟(从毫秒级降到百微秒级),大幅提升事务处理速度 (TPS) 和系统响应能力。

保持现有 FC 网络投资,管理和运维模式变化不大,降低迁移风险。

继续受益于 FC 网络的可靠性、隔离性和成熟的管理工具。

为数据库提供高性能共享存储,满足高可用和双活需求。

充分发挥后端 NVMe SSD 的性能潜力,提升硬件投资回报率。

总结

NVMe over Fabrics 通过将高效的本地 NVMe 协议扩展到网络,实现了高性能存储资源的解耦、池化和共享。其底层逻辑的核心在于最小化协议转换开销和利用高效网络传输技术(尤其是 RDMA),从而在远程访问时也能获得接近本地 NVMe SSD 的性能。无论是构建面向 AI/ML、大数据分析的超大规模高性能存储池,还是提升企业核心数据库和关键应用的性能与可用性,NVMe-oF 都已成为现代数据中心不可或缺的关键技术。选择哪种 Fabric(RDMA/FC/TCP)需要根据具体的性能需求、现有基础设施、预算和运维复杂度进行权衡。

相关推荐
『往事』&白驹过隙;12 小时前
浅谈PC开发中的设计模式搬迁到ARM开发
linux·c语言·arm开发·设计模式·iot
Hello.Reader14 小时前
从 0 到 1 理解硬盘数据恢复工具原理与工程实现
linux·运维·服务器·网络·数据库
『往事』&白驹过隙;15 小时前
C/C++中的格式化输出与输入snprintf&sscanf
linux·c语言·c++·笔记·学习·iot·系统调用
Je1lyfish15 小时前
CMU15-445 (2026 Spring) Project#1 - Buffer Pool Manager
linux·数据库·c++·后端·链表·课程设计·数据库架构
好好学习天天向上~~16 小时前
12_Linux学习总结_进程地址空间(虚拟地址)
linux·学习
BugShare16 小时前
飞牛NAS笔记本盒盖不休眠
linux
红球yyds16 小时前
haproxy介绍及部署
linux·运维·云原生
daad77719 小时前
schedule_fair
linux
盟接之桥20 小时前
制造业EDI数字化:连接全球供应链的桥梁
linux·运维·服务器·网络·人工智能·制造
一点多余.20 小时前
openGauss 企业版安装全流程指南
linux·数据库·opengauss·企业版