NVMe架构与操作理论 - 第30页
NVME2.0协议解读 1 min read

NVMe架构与操作理论 - 第30页

Blog Author

你阅读的是 《NVMe Base Specification 2.0b》第 2.2 节(Message-Based Transport Model) 的最后一部分内容,主要涉及两个关键方面:


✅ 一、NVMe over Fabrics(NVMe-oF)下的行为限制和要求

这一部分细化了消息传输模型下(NVMe-oF)的专属限制与差异点,我们来一一解构并用中文精讲理解:


📌 1. 不支持 PRP,统一使用 SGL

NVMe-oF 不支持 PRP,只支持 SGL 用于数据描述(Admin, I/O, Fabrics 全部)

模型 PRP SGL
PCIe(Memory) ✅ 支持 PRP,SGL 可选,仅限 I/O 命令 ❌ Admin 不支持
NVMe-oF(Message) ❌ 不支持 PRP ✅ 所有命令必须使用 SGL

🧠 原因解释: - PRP 依赖“主机控制器共享物理地址”,适合 PCIe; - SGL 可用 SGL Segment 封装,消息封装式更适合远程通信协议(TCP/RDMA)


📌 2. 不支持 Completion Queue Flow Control

控制器不会基于 CQ 的容量来阻止命令提交

  • 在 PCIe 模型中,CQ 拥塞时,控制器会限制新命令进入;
  • 在 NVMe-oF 中,主机需要自我管理 CQ 的剩余容量,否则可能会溢出、丢失完成项。

📌 3. 可禁用 Submission Queue Flow Control(可选)

默认有 SQ 流控,允许主机与控制器协商禁用此机制

  • 如果禁用,主机需确保 SQ 有空槽(即 SQ tail 不覆盖未完成命令)
  • 控制器不会帮你做“命令限制” → 主机责任提升

✅ 二、NVMe over Fabrics 协议分层结构(Figure 8)

📐 图示:NVMe-oF 协议栈结构

          ┌───────────────────────────────────────────────┐
          │ NVMe Architecture (命令集、队列、属性层)       │
          ├───────────────────────────────────────────────┤
          │ Transport Binding Services (与传输协议绑定)    │
          ├───────────────────────────────────────────────┤
          │ NVMe Transport(如 TCP, RDMA)                │
          ├───────────────────────────────────────────────┤
          │ Fabric Protocol(基础传输服务,可能多层)      │
          ├───────────────────────────────────────────────┤
          │ Fabric Physical Layer(物理层,如 Ethernet)   │
          └───────────────────────────────────────────────┘

🔍 分层说明:

层级 中文名称 作用
NVMe Architecture 协议核心层 命令集、Admin/I/O、队列、属性定义
Transport Binding Services 传输绑定层 将 NVMe 操作与 TCP/RDMA 映射
NVMe Transport 传输协议层 如 TCP、RDMA、FC 等
Fabric Protocol 网络协议栈 可能含 TCP/IP、RDMA、IB verbs 等
Fabric Physical 物理层 网络硬件,如 Ethernet、InfiniBand

📘 核心结论:

NVMe-oF 是一个协议套件,通过“传输绑定层”将核心命令投递机制适配到底层网络协议。


✅ 三、NVM Subsystem Ports 的作用与扩展性

An NVM Subsystem may present 1 to (64Ki - 16) controllers...通过最多 64Ki 个 Ports 暴露给主机访问

📌 控制器数目上限:最多 2^16 - 16 = 65520

  • 每个控制器(Admin 或 I/O)可被多个 host 访问
  • 控制器之间可能互不共享命名空间(取决于共享/私有设置)

📌 Subsystem Port 数上限:最多 64Ki(即 65536)个

  • 每个 port 是连接到一个主机的物理/虚拟端口
  • 便于实现:多 host 多控制器多命名空间共享结构

📘 应用于: - 多机访问同一个 SSD 或 NVM 集群(Fabric 分布式部署) - 控制器虚拟化管理(支持 SR-IOV 或多个物理控制器)


✅ 小结要点(重点知识速记)

NVMe-oF 限制与特性
PRP 支持情况 ❌ 不支持,只能用 SGL
SQ Flow Control ✅ 可选禁用,禁用后主机负责控制
CQ Flow Control ❌ 不支持,主机必须预留空位
Interrupt 机制 控制器不触发中断,主机 NIC 发起
CQ 映射 只支持 1:1(不支持 n:1)
Metadata Buffer ❌ 不支持单独 Metadata 区
协议绑定机制 使用 Transport Binding 完成协议适配
Subsystem Port 上限 64K(65536)个
Controller 上限 65520 个(64Ki - 16)

✅ 推荐下一步深入阅读:

内容 理由
§3.5 NVMe-oF 中 Queue 和 Port 的管理结构 进一步理解 Fabric 多端口结构
§6 Fabric Command Set 命令集 了解 Connect、Property Get/Set 等消息层命令
§5.3 Connect 命令详解 NVMe-oF 中连接建立的关键步骤
§8.13 NVMe-oF In-Band Authentication 消息层身份验证机制,涵盖 DH-HMAC-CHAP

如你需要,我可以:

  • 为你画出 NVMe-oF 分层结构图(更完整含主机端和控制器端流程)
  • 展示 PRP 与 SGL 的结构差异和适用场景图解
  • 构建 NVMe-oF 数据请求完整流程图(从 Capsule 到 SGL 传输)
  • 帮你模拟一个“Fabric Connect + Admin 命令执行”的交互流程

你现在是否想深入 NVMe over Fabrics 的哪一块内容?比如 Fabric 命令、连接机制、或 SGL 实战解构?我马上可以帮你图解分析!