持久内存 - 🔍 图 423 解析:多主机、多控制器、同一命名空间 Stream ID 含义示例 (第372页)
NVME2.0协议解读 1 min read

持久内存 - 🔍 图 423 解析:多主机、多控制器、同一命名空间 Stream ID 含义示例 (第372页)

Blog Author

我们继续深入解析 NVMe 2.0b 规范第 361 页 的内容,重点讲解 Figure 423 多控制器、多主机、多 Stream 情况下的行为,以及 Namespace 资源的分配机制。以下内容可以帮助你全面理解 Streams Directive 在多主机环境下的作用与资源管理逻辑


🔍 图 423 解析:多主机、多控制器、同一命名空间 Stream ID 含义示例


📊 场景结构说明

  • 所有主机(Host A、B、C)都访问同一个命名空间:NSID = 1
  • 主机 A 通过控制器 1 和 2 访问
  • 主机 B 通过控制器 3 访问
  • 主机 C 通过控制器 4 访问
  • 各主机使用不同的 Stream ID(例如 1-a、1-b、1-c、1-d)

🧠 NSSC.Bit0 决定 Stream ID 语义一致性

✅ 情况一:NSSC.Bit0 = 0(默认行为)

Stream ID 所属主机 语义关系
1-a vs. 1-b Host A 相同语义(同一个 host)
1-c Host B 不同语义
1-d Host C 不同语义

🔎 说明:Stream ID 是“Host Identifier 私有”的。
即使所有人访问的是同一个 namespace,Stream ID 的语义不共享


✅ 情况二:NSSC.Bit0 = 1(开启全局共享)

Stream ID 所属主机 语义关系
1-a, 1-b, 1-c, 1-d Host A/B/C 全部代表同一个流

🔎 说明:Stream ID 是“Host Identifier 共享”的。
多个主机使用同样的 Stream ID,表示的就是同一组相关数据(流),即控制器理解它们是一个逻辑流。


🧮 Namespace 资源分配与流状态管理


🔢 Namespace Streams Allocated(NSA)

这是 controller 为 namespace 独占分配的最大 stream 数量

📌 举例说明:

  • NSA = 4,表示该 namespace 最多允许 4 个 stream 同时处于“打开”状态;
  • 一旦第 5 个新 Stream ID 被写入请求使用,controller 会自动选择一个已打开的 Stream ID 释放掉;
  • 这是一种 自动 LRU 式淘汰策略

🔁 资源调整机制

  • 不支持增量调整。想要变更 stream 资源数量,只能:
  • 先 Release Resources
  • 再 Allocate Resources
  • ✅ 通过 Get Status 指令,host 可以获取当前哪些 Stream ID 是“打开的”。

🧠 Streams 使用小结(从主机视角)

动作 方法
检查支持的 Stream 类型 Directive Receive → Return Parameters
启用 Stream 功能 Directive Send → Enable Directive
分配资源(独占) Directive Receive → Allocate Resources
释放单个 Stream ID Directive Send → Release Identifier
释放整个命名空间的资源 Directive Send → Release Resources
获取当前打开的 Streams 状态 Directive Receive → Get Status

✅ 总结要点归纳

关键概念 说明
NSSC.Bit0 = 0 Stream ID 是 Host 私有的,跨 Host 同 ID ≠ 同流
NSSC.Bit0 = 1 Stream ID 在所有 Host 中共享,跨 Host 同 ID = 同流
Stream 打开 写入时第一次使用 Stream ID,会“打开”该流
自动释放 超过 NSA 限制时,会自动释放旧流
推荐操作 主机可主动调用 Release Identifier 避免突发淘汰

📌 如果你想继续了解 8.7.3.1.1:Streams Return Parameters 数据结构,我们可以马上进入下一节,详细剖析所有字段(SWS、SGS、NSSA、NSSC、MSL 等),这对理解系统如何调度写入流及优化介质寿命非常关键。需要继续吗?