NVMe Base 2.4:Telemetry:資料收集與一致性讀取
00.01.Telemetry 把裝置收集的內部狀態整理成主機可讀取的紀錄。這篇的重點是取得一份完整且一致的資料:誰建立紀錄、各資料區有多大,以及分段讀取期間紀錄是否已經換成另一份。
這篇的主軸
先確認誰建立紀錄
01-01主機發起與控制器發起的紀錄有不同建立方式;先分清來源,才能正確選擇讀取與確認完成的做法。
從表頭找出資料範圍
02-01先讀表頭,再用資料區邊界決定要讀哪些區段;標準定義位置,廠商資料格式決定如何理解內容。
確保分段讀到同一份紀錄
03-01資料可能分多次取回;要檢查紀錄識別與變更資訊,避免把不同時間的內容拼成一份。
把主軸連起來
00.02.先分清主機發起與控制器發起的紀錄,再從 header 得知資料區範圍。讀取多個區段時,要保留同一份紀錄的識別資訊,並依該類紀錄的規則確認讀取完成;資料區位置可由標準解釋,廠商自訂內容則需要相應格式資料。
01 資料區如何排列與計算大小
01.01.Area 是從同一 block 1 起算的不同大小視圖。先依欄位換算 header,再選擇適用且有資料的最後 area;不要把三個 Last Block 數字相加。
01.02.Telemetry 的 header 為 block 0,每個 block 是 512 bytes;所有 Data Areas 都從 block 1 起算。Area 2/3/4 是更大的累積集合,不是接在 Area 1 後的獨立區塊。Last Block 是包含在內的最後 block 編號;payload 格式與大小由廠商定義。
來源:Base 2.4 §8.1.30; 5.2.13.1.8-5.2.13.1.9
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.13.1.8-5.2.13.1.9, 文件頁 232-237,733-737, PDF 頁 258-263,759-763
| 資料區域 | 包含哪些 blocks | Last Block 數值的限制 |
|---|---|---|
| Area 1 | 1 到 L1 | L1=0 表示沒有資料 |
| Area 2 | 1 到 L2 | L2 >= L1 |
| Area 3 | 1 到 L3 | L3 >= L2 |
| Area 4 | 1 到 L4 | 支援條件另行檢查 |
02 建立快照、分段讀取與確認完成
02.01.07h 的 create 與後續讀取分開;08h 的 capture 由 controller 決定。Host 對兩者都要驗證 generation,並分清事件 acknowledgement 與刪除 payload。
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
- Host
- 主機;執行作業系統並送出 NVMe 命令的一端。
- 讀取 header,記下 generation number。
- 依資料範圍分段讀取,沿用同一份快照。
- 再次讀取 header,比較 generation number。
- 兩次 generation 相符後,才把分段內容視為同一份資料。
02.02.LID 07h 的 CTHID 是 CDW10 bit 8;設為 1 要求新 capture,0 不更新該 snapshot。MCDA 是 bits 11:9,只有 MCDAS=1 且 CTHID=1 時適用;001b 至 100b 分別要求建立至 Area 1 至 Area 4,000b 由 controller 決定。MCDAS 來自 Supported Log Pages 的 LID Specific Parameter。
- CTHID
- Create Telemetry Host-Initiated Data;07h 的 capture 要求,後續分段讀同一快照要清為 0。
- MCDAS
- Maximum Created Data Area Supported;07h 的 LID Specific Parameter bit 0,宣告 MCDA 支援。
- MCDA
- Maximum Created Data Area;支援且要求 capture 時選擇建立的最大 area。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
- LID
- Log Page Identifier;指定要讀取哪一種 log page 的編號。
來源:Base 2.4 §5.2.13.1.8
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.8, 文件頁 232-235, PDF 頁 258-261
| 快照控制欄位 | 執行或回報的動作 | 分段讀取時須注意什麼 |
|---|---|---|
| CTHID=1 | 觸發新 07h capture | 後續分段讀不要再次 create |
| MCDA | 限制建立到哪個 area | 先看 MCDAS |
| RAE=1 | 保留事件 | 不保證沒有其他 reader |
| TCDA=0 | 上次 acknowledgement 後未更新 | 2.4 不等於 payload 消失 |
- TCDA
- Telemetry Controller-Initiated Data Available;2.4 中表示自上次 RAE=0 acknowledgement 後是否有更新。
- RAE
- Retain Asynchronous Event;Telemetry 收集中用 1 保留通知狀態,完成後用 0 acknowledgement。
接著打開 Spec 看什麼
03.01.以下按概念列出閱讀位置。報告時先用上面的流程說明問題,再打開對應章節看欄位與完整條件。中文教學 HTML 另有本篇全部圖表的逐圖重點、案例與細節。
| 要說明的觀念 | Spec 閱讀位置 |
|---|---|
| 資料區如何排列與計算大小 | Base 2.4 §8.1.30; 5.2.13.1.8-5.2.13.1.9 · Base 2.4 §8.1.30; 5.2.30.1.15 · Base 2.4 §5.2.13.1.8-5.2.13.1.9 |
| 建立快照、分段讀取與確認完成 | Base 2.4 §5.2.13.1.8 · Base 2.4 §8.1.30 · Base 2.4 §5.2.13.1.9 · Base 2.4 §5.2.13.1.8-5.2.13.1.9 · Base 2.4 §8.1.30; 5.2.30.1.6 |
學完後想一想
1. Area 1 的 Last Block=3,Area 2 的 Last Block=7;Area 2 包含哪些 payload blocks?
04.01.Area 2 包含 blocks 1 到 7,共 7×512=3584 bytes,已包含 Area 1 的 blocks 1 到 3。Header 是 block 0,另占 512 bytes;Last Block 是包含在範圍內的最後編號。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30; 5.2.13.1.8-5.2.13.1.9, 文件頁 232-237,733-737, PDF 頁 258-263,759-763
2. 分段讀完 Telemetry 後,為何還要重讀 header?
04.02.分段期間可能出現另一代 snapshot。重讀 generation 可確認資料是否仍屬同一代;若改變便須重收。Controller-initiated 資料還要檢查 TCDA,避免忽略其他讀取者已確認資料的情況。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.30, 文件頁 734-735, PDF 頁 760-761
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.9, 文件頁 237, PDF 頁 263


Comments