NVMe Base 2.4:Telemetry:資料收集與一致性讀取

4 minute read

English

00.01.Telemetry 把裝置收集的內部狀態整理成主機可讀取的紀錄。這篇的重點是取得一份完整且一致的資料:誰建立紀錄、各資料區有多大,以及分段讀取期間紀錄是否已經換成另一份。

這篇的主軸

01

先確認誰建立紀錄

01-01主機發起與控制器發起的紀錄有不同建立方式;先分清來源,才能正確選擇讀取與確認完成的做法。

02

從表頭找出資料範圍

02-01先讀表頭,再用資料區邊界決定要讀哪些區段;標準定義位置,廠商資料格式決定如何理解內容。

03

確保分段讀到同一份紀錄

03-01資料可能分多次取回;要檢查紀錄識別與變更資訊,避免把不同時間的內容拼成一份。

把主軸連起來

00.02.先分清主機發起與控制器發起的紀錄,再從 header 得知資料區範圍。讀取多個區段時,要保留同一份紀錄的識別資訊,並依該類紀錄的規則確認讀取完成;資料區位置可由標準解釋,廠商自訂內容則需要相應格式資料。

01 資料區如何排列與計算大小

01.01.Area 是從同一 block 1 起算的不同大小視圖。先依欄位換算 header,再選擇適用且有資料的最後 area;不要把三個 Last Block 數字相加。

Telemetry Data Areas 是累積範圍Header 位於 block 0。每個 Data Area 都從 block 1 開始,較大的 Area 包含較小 Area 的資料。HeaderBlock 0Area 1Area 2Area 3
Header 位於 block 0。每個 Data Area 都從 block 1 開始,較大的 Area 包含較小 Area 的資料。

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

資料區如何排列與計算大小
資料區域包含哪些 blocksLast Block 數值的限制
Area 11 到 L1L1=0 表示沒有資料
Area 21 到 L2L2 >= L1
Area 31 到 L3L3 >= L2
Area 41 到 L4支援條件另行檢查

02 建立快照、分段讀取與確認完成

02.01.07h 的 create 與後續讀取分開;08h 的 capture 由 controller 決定。Host 對兩者都要驗證 generation,並分清事件 acknowledgement 與刪除 payload。

controller
controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
Host
主機;執行作業系統並送出 NVMe 命令的一端。
讓分段讀取對應同一份資料
  1. 讀取 header,記下 generation number。
  2. 依資料範圍分段讀取,沿用同一份快照。
  3. 再次讀取 header,比較 generation number。
  4. 兩次 generation 相符後,才把分段內容視為同一份資料。
Generation number 用來辨識資料版本;建立新快照與讀取既有快照是不同動作。

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

採用的規格版本

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...