第269篇:NVMe over Fabric 协议演进
关键词
NVMe、NVMe-oF、SCSI 替代、NVMe over FC、NVMe over TCP、NVMe over RDMA、存储协议演进、队列对
一、从 SCSI 到 NVMe
1.1 SCSI 的局限
SCSI(Small Computer System Interface)是传统的存储协议,已使用 30+ 年:
SCSI 命令集(基于并行/串行):
SCSI 命令格式: CDB(Command Descriptor Block) | OpCode (操作码) | LBA (逻辑块地址) | 长度 (块数) | | --- | --- | --- |
SCSI 的局限(针对 SSD/HBM):
1. 半双工——命令和响应不并行
2. 队列深度小——最多 256(iSCSI)/ 32(FC)
3. 顺序执行——命令按顺序处理
4. 软件开销大——SCSI 层 → FC/iSCSI → 硬件
5. 针对 HDD 优化——旋转磁盘,随机 IOPS 低
SCSI 时代的瓶颈: 传统 HDD:~200 IOPS(随机) SCSI 协议开销占比小
现代 SSD:1M+ IOPS
SCSI 协议开销占比大(30%+)
协议成为瓶颈!
1.2 NVMe 的诞生
NVMe(Non-Volatile Memory Express)是为 SSD 设计的原生协议:
NVMe vs SCSI 对比:
| 特点 | SCSI | NVMe |
|---|---|---|
| 队列深度 队列数量 协议层数 命令开销 并行度 中断方式 CPU 利用率 延迟 | 32-256 1 多层(SAM→SPC→SBC) 高 低 传统中断 高 100μs+ | 65536(64K) 65536 个队列 精简(直通) 低(减少 50%) 高(多队列并行) MSI-X(每队列中断) 低(减少 70%) 10μs |
NVMe 的队列模型: ┌─────────────────────────────────────┐ │ │ │ Submission Queue(SQ) │ │ App1 ──► SQ1 ──┐ │ │ App2 ──► SQ2 ──┤──► SSD(并行处理)│ │ App3 ──► SQ3 ──┘ │ │ Completion Queue(CQ) │ │ ◄── CQ1/2/3 │ │ │ │ 每个队列独立,互不阻塞 │ │ 多个队列并行提交 → 充分利用 SSD │ └─────────────────────────────────────┘
二、NVMe over Fabrics(NVMe-oF)
2.1 架构
NVMe-oF(NVMe over Fabrics)将 NVMe 扩展到网络:
| Host NVMe 驱动 Initiator NVMe-oF 层 FC/RDMA/TCP | ◄── 网络 ──────► | Storage NVMe SSD Target NVMe-oF 层 FC/RDMA/TCP |
|---|---|---|
本地 NVMe vs NVMe-oF: 本地 NVMe:NVMe 命令直接通过 PCIe 发送到 SSD NVMe-oF:NVMe 命令封装在网络协议中发送到远端 SSD
NVMe-oF 的消息模型——CAPSULE:
| NVMe Command Capsule | |
|---|---|
| NVMe Command (64 bytes) SGL/PRP List (数据描述符) Data (可选,inline 小数据) | ← 标准 NVMe 命令 |
特点: 命令封装小(64 字节) 保持 NVMe 语义不变 支持零拷贝(RDMA)
2.2 三种传输方式
NVMe-oF 支持三种底层传输:
| 特性 | NVMe/FC (FC-NVMe) | NVMe/RDMA (RoCE/iWARP) | NVMe/TCP |
|---|---|---|---|
| 网络 协议 延迟 吞吐量 CPU 开销 丢包敏感性 部署 适用场景 | FC(16/32/64G) FC-FCP ~10μs 高 极低(硬件) 低(Credit) 需要 FC 网络 核心业务 | 以太网 RDMA ~10μs 高 低(RDMA) 高(需无损) 需要 RoCE AI/HPC | 以太网 TCP ~100μs 中 中(TCP) 低(TCP重传) 标准网络 通用/备份 |
选择建议: 已有 FC 投资 → NVMe/FC 新建数据中心 → NVMe/RoCE(性能均衡) 预算有限/长距 → NVMe/TCP
2.3 NVMe/FC vs FC-SCSI
从 SCSI-FCP 到 FC-NVMe 的演进:
传统的 FC-SCSI(FCP): | ┌────┐ SCSI CDB ┌────┐ FC ┌────┐ SCSI ┌────┐ | | | | | | | | --- | --- | --- | --- | --- | --- | --- | | App | ───► FC ───► 封装 | FC HBA | ───► | Storage 控制器 | ───► | 磁盘 | 多层转换 → 高延迟
FC-NVMe: | ┌────┐ NVMe Cmd ┌────┐ FC ┌────┐ NVMe ┌────┐ | | | | | | | | --- | --- | --- | --- | --- | --- | --- | | App | ───► FC ───► 封装 | FC HBA | ──────► | NVMe SSD | ───► | SSD | 命令直通 → 低延迟
关键区别: FC-SCSI:协议栈经过 SCSI 层 → 命令转换 FC-NVMe:NVMe 命令直通到 SSD → 无转换
三、NVMe over TCP
3.1 为什么需要 NVMe/TCP
NVMe/TCP(RFC 9569)是 NVMe-oF 中部署最简单的方案:
动机:
不需要专用硬件(FC/RoCE)
利用现有 IP 网络
支持长距离 DCI
标准 TCP 可靠传输
适用场景:
备份/归档(非极致性能需求)
远程复制
DCI(跨数据中心)
中小规模部署
性能:
单流:25Gbps(Linux 优化后)
延迟:100-200μs(受 TCP 影响)
相比 NVMe/RDMA 性能低,但比 iSCSI 好
3.2 NVMe/TCP 封装
NVMe/TCP 封装格式:
NVMe Command Capsule NVMe/TCP PDU 类型:Command/Response 长度:可变 TCP(端口 4420) IP Ethernet
NVMe/TCP PDU 类型: ICReq/ICResp:初始化连接 CapsuleCmd:NVMe 命令 CapsuleResp:NVMe 响应 Data-In:数据从 Target 到 Host Data-Out:数据从 Host 到 Target R2T:Ready to Transfer
3.3 配置示例
# Linux NVMe/TCP Target(存储端,nvmf)
#
modprobe nvmet
modprobe nvmet-tcp
# 创建 NVMe Target
mkdir /sys/kernel/config/nvmet/subsystems/nvme-test
cd /sys/kernel/config/nvmet/subsystems/nvme-test
# 允许所有主机访问
echo 1 > attr_allow_any_host
# 创建命名空间
mkdir namespaces/1
echo -n /dev/nvme0n1 > namespaces/1/device_path
echo 1 > namespaces/1/enable
# 创建端口(TCP)
mkdir /sys/kernel/config/nvmet/ports/1
echo 192.168.1.100 > addr_traddr
echo 4420 > addr_trsvcid
echo tcp > addr_trtype
echo ipv4 > addr_adrfam
# 关联子系统
ln -s /sys/kernel/config/nvmet/subsystems/nvme-test /sys/kernel/config/nvmet/ports/1/subsystems/nvme-test
# Linux NVMe/TCP Initiator(客户端)
#
modprobe nvme-tcp
# 发现 Target
nvme discover -t tcp -a 192.168.1.100 -s 4420
# 连接
nvme connect -t tcp -n nvme-test -a 192.168.1.100 -s 4420
# 查看 NVMe 设备
nvme list
fdisk -l /dev/nvme0n1
四、存储协议演进路线
存储协议演进时间线:
1990s:SCSI(并行) 并行 SCSI 电缆 16 设备限制 5M-320MB/s
2000s:FC-SAN / iSCSI FC:4/8/16Gbps iSCSI:1/10Gbps 队列深度 256 延迟 100-500μs
2010s:NVMe(本地) PCIe 3.0/4.0 64K 队列深度 延迟 < 10μs 1M+ IOPS
2015s:NVMe-oF FC-NVMe / NVMe/RoCE 延迟 ~10μs 协议直通
2020s:NVMe/TCP + NVMe/RoCE NVMe/TCP 普及(标准网络) NVMe/RoCE 极致性能 计算存储 + 存算分离
当前推荐: | 场景 | 推荐方案 | | --- | --- | | 核心数据库 AI 训练存储 虚拟化 备份/归档 跨 DC 复制 | FC-NVMe 或 NVMe/RoCE NVMe/RoCE NVMe/RoCE 或 NVMe/TCP NVMe/TCP NVMe/TCP |
五、总结
| 知识点 | 核心要点 |
|---|---|
| SCSI 局限 | 队列深度小、协议层多、针对 HDD 设计 |
| NVMe 优势 | 64K 队列、多队列并行、协议精简 |
| NVMe-oF | 将 NVMe 扩展到网络,三种传输方式 |
| NVMe/FC | 在 FC 网络上传输 NVMe,替换 SCSI-FCP |
| NVMe/RDMA | 基于 RoCE/iWARP,高性能低延迟 |
| NVMe/TCP | 标准 TCP 网络,简单易部署,性能适中 |
| Capsule | NVMe-oF 的消息单元,64 字节命令 |
| 选型 | 核心业务选 FC/RDMA,通用选 TCP |
六、思考
- SCSI 协议在面对现代 SSD 时存在哪些性能瓶颈?NVMe 如何解决这些瓶颈?
- NVMe 的队列模型相比 SCSI 有什么优势?为什么多队列对 SSD 性能至关重要?
- NVMe-oF 的三种传输方式(FC/RDMA/TCP)在延迟、CPU 开销和部署复杂度上各有什么特点?
- NVMe/TCP 相比 iSCSI 在协议效率上有什么优势?两者都基于 TCP,为什么 NVMe/TCP 性能更好?
- 在一个 AI 训练集群中,存储访问延迟是瓶颈,你会选择哪种 NVMe-oF 方案?理由是什么?
下篇预告:第270篇《NVMe over RoCEv2 部署案例》——在数据中心实际部署 NVMe over RoCEv2 的完整流程,包括无损网络配置、性能调优与故障排查。