NVMe 和 NVMe-oF 都是为闪存设计的高速存储协议。区别可以先简单理解为:
- NVMe:访问本机通过 PCIe 连接的 SSD。
- NVMe-oF:把 NVMe 命令通过网络发送,访问远端 SSD。
- NVMe/NVMe-oF 存储服务:将一组本地 NVMe SSD 组织起来,通过 NVMe-oF 对其他服务器提供块存储。
1. NVMe 是什么
NVMe(Non-Volatile Memory Express)是一套面向 PCIe 固态存储的协议。
传统 SATA/SAS 协议最初主要为机械硬盘设计,队列和并发能力有限。NVMe 从设计之初就考虑了 SSD 的高并发与低延迟。
NVMe 的关键机制包括:
- 多队列模型
- 每个队列可容纳大量请求
- 每个 CPU 核可以拥有独立队列
- 通过 PCIe 直接访问设备
- 支持异步并行 I/O
- 减少共享锁和寄存器访问
典型路径为:
1 | 应用 |
一台服务器安装多块 NVMe SSD 后,可以直接使用,也可以在上面构建 RAID、逻辑卷、数据库或分布式存储。
2. NVMe-oF 是什么
NVMe-oF 全称是 NVMe over Fabrics。
它把 NVMe 的提交队列、完成队列和命令模型扩展到网络,使客户端可以像使用块设备一样访问远端 NVMe 存储。
1 | 计算节点 存储节点 |
在 Linux 客户端上连接远端设备后,通常能看到类似设备:
1 | /dev/nvme1n1 |
对应用来说,它看起来接近本地 NVMe 块设备,但数据实际存储在远端服务器。
需要注意:NVMe-oF 提供的是块存储,本身不是共享文件系统。多台主机同时挂载同一个 namespace 时,如果上层文件系统或应用不支持多主机并发,可能造成数据损坏。
3. 一套 NVMe-oF 服务有哪些角色
Initiator / Host
客户端,也叫主机端。负责:
- 发现远端存储服务
- 建立网络连接
- 提交 NVMe 读写命令
- 把远端 namespace 暴露为本地块设备
Linux 内核和 SPDK 都可以充当 initiator。
Target
服务端,负责接收 NVMe-oF 命令,并将请求转发到后端存储。
Target 可以使用:
- Linux 内核 NVMe target
- SPDK NVMe-oF target
- 商业存储系统
- 分布式存储软件
Subsystem
一个逻辑 NVMe 存储控制器,可以理解为一个对外提供服务的存储实例。
Subsystem 通常有唯一的 NQN:
1 | nqn.2026-09.example:storage01 |
NQN 类似 NVMe 世界里的服务标识。
Namespace
Subsystem 暴露的逻辑块设备。一个 subsystem 可以包含多个 namespace。
1 | Subsystem |
namespace 后面可以对应:
- 一整块 NVMe SSD
- SSD 的一个分区
- RAID 逻辑盘
- 逻辑卷
- SPDK bdev
- 分布式存储中的虚拟块设备
Transport
负责在主机与 target 之间传输 NVMe 命令和数据,例如 TCP、RDMA。
4. NVMe-oF 常见传输方式
NVMe/TCP
使用普通 TCP/IP 网络,适合云平台、通用数据中心和成本敏感的存储网络。
- 优点:
- 可以运行在常规以太网上
- 网络设备和运维体系成熟
- 部署相对简单
- 路由和跨网段更方便
- 缺点:
- TCP 协议栈会增加 CPU 消耗和延迟
- 在极致低延迟场景下通常不如 RDMA
NVMe/RDMA
通过 RDMA 网络传输,常见底层包括 RoCEv2 和 InfiniBand,适合高性能数据库、AI/HPC 和高端全闪存阵列。
- 优点:
- 延迟更低
- CPU 开销更小
- 可直接在内存之间传输数据
- 适合高 IOPS 和低尾延迟场景
- 缺点:
- 网卡和交换机配置更加复杂
- RoCE 网络通常需要合理配置拥塞控制
- 故障诊断和运维门槛更高
NVMe/FC
通过 Fibre Channel 网络承载 NVMe。它适合已经部署 FC SAN 的企业数据中心,可以复用现有的隔离、安全与运维体系,但基础设施成本通常较高。
5. SPDK 如何实现 NVMe-oF 服务
SPDK 可以在存储服务器上同时承担两类工作:
- 在用户态直接控制本地 NVMe SSD。
- 将这些设备通过 NVMe/TCP 或 NVMe/RDMA 暴露给远端客户端。
典型数据路径:
1 | 客户端应用 |
SPDK target 的性能来源主要包括:
- 用户态设备驱动
- 轮询代替中断
- 每核独立执行线程
- 异步、无锁数据路径
- 减少内核切换
- DMA 和零拷贝优化
- 队列与 CPU 核绑定
在 RDMA 场景中,数据可能直接在客户端内存与服务端 DMA 内存之间移动,CPU 主要处理控制逻辑。
6. 一个请求是怎样执行的
以远程读取为例:
1 | 1. 应用向 /dev/nvme1n1 发起读取 |
实际实现会通过队列并行、批量处理和流水线执行重叠这些步骤。
7. 它解决了什么问题
计算与存储解耦
如果 SSD 全部安装在计算服务器中,扩容时计算和存储经常需要一起扩展。NVMe-oF 可以把两者分开:
1 | 计算资源池 ←→ 网络 ←→ NVMe 存储资源池 |
计算节点和存储节点可以分别扩容。
提高 SSD 利用率
本地 SSD 容易出现某些服务器容量不足、某些服务器大量空闲的问题。集中形成存储池后,可以灵活分配 namespace。
提供接近本地盘的访问模型
客户端继续使用标准 NVMe 块设备接口,数据库和文件系统不需要理解服务端的实际磁盘布局。
支持高性能集中存储
相比传统 iSCSI,NVMe-oF 保留了 NVMe 的多队列和高并发模型,更适合 NVMe SSD。
8. 它不主动提供什么
NVMe-oF 主要负责高效传输块 I/O,并不天然解决完整存储系统的全部问题。
它本身不等于:
- RAID
- 副本和纠删码
- 快照
- 精简配置
- 数据一致性协议
- 故障自动迁移
- 分布式元数据
- 文件系统
- 对象存储
- 备份与灾难恢复
因此,真正的存储服务通常会在 NVMe-oF 上下增加控制层和数据保护层:
1 | 控制面 |
9. 与其他存储方式的区别
| 技术 | 提供的接口 | 典型特点 |
|---|---|---|
| 本地 NVMe | 本地块设备 | 延迟最低,但无法方便地跨服务器共享 |
| NVMe-oF | 远程块设备 | 高性能、计算存储解耦 |
| iSCSI | 远程 SCSI 块设备 | 兼容成熟,但协议路径相对传统 |
| NFS | 文件接口 | 多客户端共享方便 |
| Ceph RBD | 分布式块设备 | 自带分布式能力,但软件路径较长 |
| S3 | 对象接口 | 适合海量非结构化数据,不是块设备 |
| 分布式文件系统 | 文件接口 | 提供目录和文件语义,系统更复杂 |
10. 常见应用场景
NVMe-oF 比较适合:
- 数据库集群的远程高性能数据盘
- 虚拟机和容器的高速块存储
- AI 训练数据缓存或 checkpoint 存储
- HPC 计算集群
- 云平台弹性云盘
- 全闪存阵列
- disaggregated storage,解耦式存储架构
如果业务主要是普通文件共享、归档或低频访问,NFS、对象存储或传统分布式存储可能更简单、更经济。
本文作者:jujimeizuo
本文地址: https://blog.jujimeizuo.cn/2026/09/14/NVMe-NVMe-oF/
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0 协议。转载请注明出处!