NVMe/NVMe-oF

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
2
3
4
5
6
7
8
9
应用

文件系统或块设备层

Linux NVMe 驱动

PCIe

本机 NVMe SSD

一台服务器安装多块 NVMe SSD 后,可以直接使用,也可以在上面构建 RAID、逻辑卷、数据库或分布式存储。

2. NVMe-oF 是什么

NVMe-oF 全称是 NVMe over Fabrics。

它把 NVMe 的提交队列、完成队列和命令模型扩展到网络,使客户端可以像使用块设备一样访问远端 NVMe 存储。

1
2
3
4
5
6
7
计算节点                           存储节点
┌─────────────┐ ┌─────────────┐
│ 应用/文件系统 │ │ NVMe SSD × N│
├─────────────┤ ├─────────────┤
│ NVMe-oF 主机 │ ─── 高速网络 ───→ │ NVMe-oF目标端│
│ Initiator │ ←─────────────── │ Target │
└─────────────┘ └─────────────┘

在 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
2
3
4
Subsystem
├── Namespace 1:1 TB
├── Namespace 2:2 TB
└── Namespace 3:500 GB

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 可以在存储服务器上同时承担两类工作:

  1. 在用户态直接控制本地 NVMe SSD。
  2. 将这些设备通过 NVMe/TCP 或 NVMe/RDMA 暴露给远端客户端。

典型数据路径:

1
2
3
4
5
6
7
8
9
10
11
客户端应用

客户端 NVMe-oF initiator

TCP 或 RDMA 网络

SPDK NVMe-oF target

SPDK bdev

本地 NVMe SSD

SPDK target 的性能来源主要包括:

  • 用户态设备驱动
  • 轮询代替中断
  • 每核独立执行线程
  • 异步、无锁数据路径
  • 减少内核切换
  • DMA 和零拷贝优化
  • 队列与 CPU 核绑定

在 RDMA 场景中,数据可能直接在客户端内存与服务端 DMA 内存之间移动,CPU 主要处理控制逻辑。

6. 一个请求是怎样执行的

以远程读取为例:

1
2
3
4
5
6
7
8
9
1. 应用向 /dev/nvme1n1 发起读取
2. initiator 生成 NVMe Read 命令
3. 命令通过 TCP 或 RDMA 发给 target
4. target 找到对应 subsystem 和 namespace
5. target 向后端 SSD 提交读取
6. SSD 将数据 DMA 到服务端内存
7. 数据通过网络发送到客户端内存
8. target 返回 NVMe completion
9. 应用收到读取完成

实际实现会通过队列并行、批量处理和流水线执行重叠这些步骤。

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
2
3
4
5
6
7
8
9
10
11
12
控制面
├── 卷创建与删除
├── 权限与主机映射
├── 容量调度
├── 健康检查
└── 故障切换

数据面
├── NVMe-oF target
├── RAID/副本/纠删码
├── 快照与精简配置
└── NVMe SSD

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 协议。转载请注明出处!