摘要

  • NVM Express, Inc. 是管理 NVMe 规范系列的非营利行业联盟;它不生产 SSD、控制器、交换机或存储系统。

  • NVMe 用内存中的多个提交队列和完成队列取代了从机械硬盘继承的窄队列假设,以适应并行闪存和多核处理器。

  • 同一个控制器、子系统和命名空间模型既可以在 PCIe 上本地运行,也可以通过 TCP 或 RDMA 的 NVMe over Fabrics 远程运行。

  • NVMe 2.x 系列成了一个分模块的标准。2026 年 8 月 4 日发布的 2.4 套件包括 Base、PCIe/RDMA/TCP 传输层、NVMe-MI、Boot 和多个专用命令集。

  • 该协议让容量可以组合,但不规定文件系统、耐久性、RAID、纠删码、网络设计、运营安全或应用一致性。

存储命令可以离开服务器,而无需改变其基本语言

一次读取可能发往通过 PCIe 连接的本地命名空间,也可能通过 fabric 发往远程子系统。介质、控制器和路径会变化,但命令和队列模型保持不变。

这种连续性使存储可以解耦。容量可以汇集成资源池,按需分配给主机,而不必把每个设备放在消耗它的机箱内。

但解耦带来了新的发现机制、网络、多路径、认证、重连和故障域。NVMe 让存储变成可编程的服务,但并没有消除拓扑。

闪存需要一种基于并行构建的协议

更早的接口反映了机械硬盘时代和有限队列的现实。闪存可以同时服务大量操作,而现代服务器拥有众多核心。

NVMe 使用内存中的提交队列和完成队列对。主机写入命令、敲击 doorbell,并通过中断或轮询接收完成通知。多个队列减少了共享锁竞争,并可绑定到特定核心。

实际结果取决于固件、PCIe 拓扑、NUMA、队列深度、中断和工作负载。一个名字并不能保证人人都能得到相同性能。

行业联盟将协议治理与商业竞争分开

相关工作始于 2000 年代末,NVMe 1.0 于 2011 年发布,NVM Express, Inc. 于 2014 年成立。联盟成员包括处理器、介质、控制器、网络、云和系统公司。

截至本文截稿,Google 的 Amber Huffman 担任主席,AMD 的 Curtis Ballard 担任财务主管,Microchip 的 David Allen 担任秘书,董事会另有 13 名发起人代表。

联盟定义规范与合规计划。成员在芯片、固件、产品、支持和性能上相互竞争。成员资格并不证明实现了所有功能。

NVMe 2.0 把一份臃肿的文档变成了模块化的规范家族

随着传输层和数据模型的增加,把所有内容塞进一份文档变得困难。2021 年的 2.0 重组将 Base、命令集和传输层分开。

这样一来,可以在不重写每条命令的情况下发展 TCP,也可以在不改动每个传统控制器的情况下发展 ZNS。代价是更大的版本矩阵。

2026 年 8 月 4 日发布的 2.4 套件包括 Base 2.4、PCIe 1.4、RDMA 1.3、TCP 1.3、NVMe-MI 2.2、Boot 1.4,以及 NVM、Key Value、Zoned Namespace、Computational Programs 和 Simple Log Memory 命令集。“NVMe 2.4”不是一个单独文件。

提交队列和完成队列让工作更贴近 CPU 核心

主机将命令写入提交队列,控制器将结果放入完成队列。不同的进程或核心可以使用独立的队列对,减少竞争。

Doorbell 用于宣告新工作。轮询有时能降低延迟,但消耗 CPU;中断合并降低成本但增加等待。队列深度影响利用率和尾延迟。

更深的队列并不总是更好。它可能掩盖饱和并增加排队时间。配置必须匹配工作负载。

控制器、子系统和命名空间把逻辑与介质分开

控制器暴露队列和命令。一个子系统可以包含多个控制器。命名空间代表可通过多条路径访问的逻辑容量。

主机看到的标识符不一定对应单块磁盘。系统可以聚合多种介质,并呈现稳定的命名空间。

NVMe 不规定数据的位置、复制或保护。RAID、纠删码、精简配置和一致性仍属于周围系统。

管理命令定义 I/O 运行环境

管理队列负责标识、队列创建、特性、日志、固件、命名空间和安全。它配置读写在其中运行的上下文。

一条管理命令可能删除命名空间、启用错误的固件或改变功耗设置。因此需要权限控制、审计和变更管理。

在设计中把管理面与 I/O 分开是有益的,但这并不会让控制面变得不重要。在 fabric 环境中,两者可能依赖同一张网络。

PCIe 让本地路径贴近内存和硬件

NVMe over PCIe 使用共享内存结构和位于本地总线上的控制器寄存器。它是服务器内磁盘和卡片的直接路径。

拓扑仍然重要。设备可能位于 PCIe 交换机之后、另一个 NUMA 插槽上,或共享通道。CPU、内存和设备的相对位置影响性能。

仅仅数磁盘数量是不够的。延迟可能在主机内部、在到达介质之前就已经产生。

NVMe over Fabrics 把本地关系变成网络服务

NVMe-oF 1.0 和 NVMe-MI 1.0 于 2016 年 6 月 9 日发布。NVMe-oF 将 capsule 和数据传送到远程子系统,并通过 fabric 建立队列。

这允许聚合容量、将计算与存储分离。主机可以更换,而数据留在原地。

但它把网卡、交换机、路由、发现、控制器、认证和多路径加入数据路径。网络成为数据完整性系统的一部分。

发现控制器简化了连接,也制造了关键依赖

主机查询发现控制器以获取子系统、地址和服务。这减少了对每个目标端的手动配置。

错误信息或故障服务可能阻止新连接,或将流量引向错误位置。需要冗余、缓存、校验和身份保护。

发现服务的可用性不等于数据的可用性。现有会话可能继续,而新主机无法连接。

NVMe/TCP 把存储带到普通 IP 网络

2019 年标准化的 NVMe/TCP 通过 TCP 连接传输命令和数据。运营商可以使用现有路由 Ethernet、IP 工具和防火墙,而无需构建 RDMA。

便利是有代价的。TCP 协议栈、拷贝、中断和 CPU 会影响尾延迟。内核、卸载、传输大小和调优都很重要。

该传输增加了成帧和校验值,并可使用 TLS。支持 TLS 并不意味着它被正确启用或管理。

NVMe/RDMA 追求低延迟,同时对 fabric 提出更高纪律

RDMA 使用队列对、注册内存和网卡卸载,以更少 CPU 干预传输数据,适合 HPC 和 AI。

RDMA 不是单一网络。RoCE、iWARP 等在拥塞、丢包、PFC、ECN 和内存方面各不相同。

一个快速的 benchmark 并不能证明易于运维。网络故障可能表现为存储超时,需要同时具备网络和系统方面的经验。

多路径把冗余变成主机端的决策

命名空间可以通过多个控制器和路径访问。主机决定负载均衡和故障切换。非对称命名空间访问(ANA)将路径描述为 optimized、non-optimized 或 unavailable。

两条链路可能共享交换机、控制器、电源或路由。必须用真实故障测试独立性。

错误的策略可能保留一条死路径,或把 I/O 发送到慢速路径。冗余是可度量的行为,而不是端口数量。

预留(reservations)管理共享访问,但不替代共识

NVMe 预留允许主机注册并保留命名空间,以防止未经授权的写入。这对集群和故障切换很有用。

它不能替代共识或应用一致性。故障主机可能留下过期状态,fencing 必须阻止旧节点写入。

保护不当的恢复可能演变成中断或数据损坏。

存储一旦离开 PCIe,认证和 TLS 就成为必需

本地设备隐含依赖物理边界。在网络上,发起端和目标端必须证明身份并保护通道。

NVMe 定义了认证机制,TCP 可以使用 TLS。效果取决于密钥、证书、轮换、算法和策略。功能存在不等于安全使用。

必须把 discovery、管理面和数据面放在一起分析。身份可能是真实的,但权限可能过宽。

NVMe-MI 提供独立于应用 I/O 的管理路径

NVMe 管理接口允许清点子系统、读取健康状态,并在带外执行某些命令。

这有助于维护和恢复,但也增加了一个独特的攻击面。集中式工具可能读取敏感信息或修改大量设备。

NVMe-MI 可以与 Redfish 集成。这并不会把标准和供应商的责任合并到单一实体。

Zoned Namespace 向软件暴露介质的限制

ZNS 将容量划分为按顺序写入的 zone。主机如果了解布局,可以减少内部垃圾回收,提高耐久性或可预测性。

这需要能够感知 zone 的文件系统、数据库或存储层。传统应用不会自动受益。

ZNS 揭示了一种权衡:暴露介质行为可以提高效率,但会增加软件可移植性的成本。

Key Value、Simple Log Memory 和 Computational Programs 扩展了命名空间的含义

专用命令集支持键值访问、简单日志或靠近存储的计算,以减少转换和数据移动。

采用取决于控制器、驱动、库和应用。规范中存在该功能并不代表它已普及。

选项越多,能力发现和回退就越重要。标准化同时创造了灵活性和新的商业兼容矩阵。

合规测试提供证据,但不认证端到端性能

合规计划和互操作性实验室测试主机与控制器之间的特定行为,能发现文本中看不出的差异。

清单并不测量每种拓扑下的延迟、耐久性、恢复或安全。可选特性和驱动-固件兼容矩阵会变化。

采购方应把合规视为最低门槛,并测试自己的工作负载、故障和升级。

解耦存储把容量与主机分离,也重新分配了责任

本地存储把设备、服务器和系统团队绑定在一起。远程资源池服务多个消费者,其配额通过软件动态变化。

网络、存储、平台、安全和应用团队共同面对故障。fabric 故障看起来可能像数据库问题,固件问题看起来可能像网络丢失。

可行性取决于利用率和运维能力,而不仅仅是每 TB 的价格。

AI 把存储延迟变成计算成本

训练任务加载数据集、写入检查点并大规模传输状态。当数千个加速器在等待时,存储延迟就是昂贵的浪费。

TCP、RDMA、多路径和共享命名空间提供了不同的设计。选择时必须把拥塞、元数据、队列、故障和恢复纳入考量。

目标不只是峰值吞吐量,而是在并发负载下可预期的队列延迟和恢复。

NVMe 2.4 展现了协议的广度和版本矩阵的压力

该套件汇集了 Base、传输层、Boot、管理接口和命令集。NVMe 已经成为一个技术栈,而不只是 SSD 接口。

主机可能支持 Base 2.4 但不支持所有命令集,控制器的 TCP 支持也可能与 RDMA 不同。支持声明必须准确。

驱动、操作系统、固件、传输层和管理工具共同构成一个矩阵,实际上已成为协议的一部分。

NVMe 让存储变得可组合,而不是简单

该标准降低了单一切换成本:命令和命名空间可以从 PCIe 迁移到 fabric,或在不同供应商之间移动。数据迁移、安全、网络、监控和支持仍然存在。

好处是协议与产品解耦。风险是在 NVMe 这个名字下掩盖了差异很大的设计。

存储变得可编程、可分布,但它仍然是一个数据完整性系统,必须在故障时被理解。