NVMe架构与操作理论 - 第30页
你阅读的是 《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 实战解构?我马上可以帮你图解分析!