错误处理与诊断 - 第435页
NVME2.0协议解读 1 min read

错误处理与诊断 - 第435页

Blog Author

我们继续深入分析 NVMe Base Specification Revision 2.0b 第 8.24 节末尾部分,聚焦于:


🔍 Telemetry 数据日志结构与采集流程深入讲解


Telemetry 数据日志类型(Telemetry Data Logs)

NVMe 标准定义了两种遥测数据日志页:

  1. Host-Initiated Log Page(主机发起)
  2. Controller-Initiated Log Page(控制器主动触发)

📏 结构组成

无论哪种日志类型,其结构都由多个固定大小的 Telemetry Data Block(512 字节)组成,这些 Block 又被划分为多个 Telemetry Data Area

Data Area 编号 说明 大小 用途阶段
Area 1 Small(小型) ⬇︎ 问题初识阶段
Area 2 Medium(中型) ⬆︎ 问题调查阶段
Area 3 Large(大型) ⬆︎⬆︎ 根因分析阶段
Area 4(可选) Extra-Large(特大型) ⬆︎⬆︎⬆︎ 深度诊断阶段

⚠️ Data Area 4 只有在: - Log Page Attributes.bit[6]=1; - ETDAS=1h(即主机行为支持扩展遥测区)
的情况下才被支持。


🔄 主机采集控制器遥测数据的标准流程(Operational Model)

以下是 Host 收集 Telemetry 数据的推荐步骤:

📘 第一步:确认支持

  • 主机通过读取 Identify Controller 数据结构确认是否支持 Telemetry Log Page;
  • 通过设置 Host Behavior Support Feature → ETDAS = 1h,声明支持 Area 4(若支持);

📦 第二步:准备空间

  • 如果主机需要保存遥测数据,应提前分配存储区;

🔔 第三步:配置事件通知

  • 主机启用 Asynchronous Event Configuration 中的 Telemetry Log Notices,以便在控制器准备好 Telemetry 数据时能收到通知;

📥 第四步:数据采集

主机开始收集 Telemetry 数据(无论是 Host-Initiated 还是 Controller-Initiated):

  • 步骤 a:读取对应的 Telemetry Log Page
  • 推荐读取全部可用的 Area 1~4;
  • 每次读取单位是 512 字节的 Telemetry Data Block
  • 使用 Retain Asynchronous Event = 1 表示“保持未读标志”;

  • 步骤 b:校验一致性

  • 重读日志头并确认 Data Generation Number 是否与第一次读取一致;
  • 若不一致,表明日志可能更新,应重新读取;

  • 步骤 c:确认读取完成(仅适用于控制器发起的日志)

  • 主机应再次读取日志页,并设置 Retain Asynchronous Event = 0,通知控制器数据已读取完成;

  • 步骤 d:转发数据

  • 将日志数据转发给控制器厂商,用于问题分析与产品改进;

⏱️ 主机发起采集的触发场景

主机可以在以下场景发起 Telemetry 数据采集:

  • 系统崩溃后的紧急调试;
  • 正常运行过程中,主动调试和记录问题;

通过 Get Log Page 命令并设置:

  • Log Specific field → Create Telemetry Host-Initiated Data = 1

控制器应尽可能快速(推荐 <1 秒)返回结果,以避免系统重启前无法完成数据保存。


✅ 小结与建议

项目 内容
✅ 支持方式 主机通过 Identify Controller 与 Host Behavior Support 配置
✅ 结构 Telemetry 分为最多四个 Area,每个由若干 512B Block 组成
✅ 操作流程 获取 → 校验 → 确认读取完成(控制器发起时) → 上报厂商
✅ 应用场景 崩溃分析、稳定性测试、性能瓶颈调查等
⚠️ 注意事项 若数据不一致,需重读;注意异步事件的读取确认机制

如果你需要我进一步:

  • 绘制 Telemetry 四阶段采集机制流程图
  • 制作 Log 读取与一致性校验的操作示意图
  • 或为遥测流程生成 调试脚本示例(如 Linux NVMe CLI 操作)

告诉我即可,我马上为你整理出来!🛠️📊