NVMe Endurance Group:健康資訊、事件清單與通知設定
00.01.同一個儲存裝置裡,不同儲存群組的耐用度與健康狀態可能不同。Endurance Group Information 讓主機查一組的警告、讀寫量與容量;Event Aggregate 則把需要注意的群組列出來。本篇把 FID 18h 的逐組設定接到這兩份 log,說明主機如何從一則通知走到具體資料,又如何確認事件而不誤以為問題已經修復。
- Endurance Group
- 耐用度群組;一起管理儲存耐用度的一組容量,可分給零個或多個 NVM Set。
- FID
- Feature Identifier;Get/Set Features 用來選擇查詢或設定功能的代碼。
這篇的主軸
觀察對象與健康狀態
01-01先分清 Group、Set、namespace 的歸屬,再讀警告與壽命估計;避免把一組的資訊當作整台裝置的結論。
- namespace
- 主機可用 NSID 指定的邏輯儲存空間。
數值的單位與限制
02-01資料量、命令次數、容量各有自己的單位。用實際數字看懂向上取整與「0 表示未回報」,才不會算出不存在的精確值。
設定如何變成待處理清單
03-01逐組選擇警告,再理解清單如何排序、如何編碼長度;識別值、項目序號與 byte 位置各不相同。
通知與確認的先後關係
04-01從 AER 完成結果找到清單,再找到單組資料;比較清除通知、移除項目與警告解除,掌握持續警告的處理方式。
- AER
- Asynchronous Event Request;主機先送出並等待控制器用完成結果回報事件的命令。
00.02.預備知識:OS、Computer Organization 與基本 SSD 概念。Group 7/9、警告值與流量數字皆是說明性範例,並非任何特定裝置的量測結果。
00.03.先學會看懂資料,再走完整的通知流程;必要的 Get Log Page、Get/Set Features 與 AER 欄位會在本文就近說明。
把主軸連起來
00.04.用同一個問題串起全篇:Group 7 的可用備用容量降到 8%,門檻為 10%,而且可靠度下降。主機要能說出:哪些 bit 描述狀態、哪些 bit 選擇通知、清單如何找到 7,以及哪次讀取才算確認這一組的事件。
00.05.健康資料提供現在的狀態與累積統計;事件機制協助主機及時查看。前者不能完整重建通知當時的狀態,後者也不會因為主機已確認事件就修復媒體。
01 先確認正在觀察哪一組儲存空間
- LSI
- Log Specific Identifier;依 log 種類指定對象,LID09h 用它指定 ENDGID。
01.01.LID 09h 提供指定 Endurance Group 的 512-byte 資料;LID 0Fh 彙整有待處理事件的 Group 識別值;FID 18h 則逐組選擇要回報的警告。三者分別回答「現在如何」、「哪些組需要查看」與「哪些情況需要列入清單」。
- LID
- Log Page Identifier;Get Log Page 用來選擇回覆資料種類的代碼。
來源:Base 2.4 §5.2.13.1.10, 5.2.13.1.15, 5.2.30.1.17
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 5.2.13.1.15, 5.2.30.1.17, 文件頁 237-239,270,478, PDF 頁 263-265,296,504
02 讀懂當下警告,不把估計壽命當作故障宣判
| 觀察項目 | 本例判讀 | 不能代替的判斷 |
|---|---|---|
| bit0=1;AVSP8 < AVSPT10 | 備用容量低於門檻 | 壽命只剩8% |
| bit2=1 | Group 可靠度下降 | 所有其他 Group 都相同 |
| bit3=0 | 此欄未回報整組唯讀警告 | 所有 namespace 都一定可以寫 |
| PUSED=103 | 已超過估計耐用度的100% | 媒體已故障,或剩餘容量為負 |
- PUSED
- Percentage Used;Group 已使用壽命的廠商估計百分比。
- EGCW
- Endurance Group Critical Warning(s);在 log 中是警告狀態,在 FID18h 中是選擇哪些警告觸發事件的遮罩。
02.01.LID 09h 的 EGCW 是處理 Get Log Page 當時的警告狀態,可能已不同於通知發生時。bit 0 表示備用容量低於門檻,bit 2 表示可靠度下降,bit 3 表示整組 namespace 因非寫入保護設定的原因進入唯讀;bit 1 與 bits 7:4 保留。PUSED=100 表示估計耐用度已用完,並不直接表示媒體故障。
來源:Base 2.4 §5.2.13.1.10
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 文件頁 238, PDF 頁 264
03 把累積量、命令次數與容量分開換算
| 欄位 | 數值3代表什麼 | 若是0 |
|---|---|---|
| DUR/DUW/MUW | 2,000,000,001~3,000,000,000 bytes | 未回報這項數值 |
| HRC/HWC | 3 筆已完成的對應類別命令 | 計數為0 |
| TEGCAP/UEGCAP | 3 bytes(僅示範單位) | 未回報容量 |
| NUMENT(LID0Fh) | 清單有3筆 | 清單沒有項目 |
- NUMENT
- Number of Entries;清單實際項目數,直接計數。
- TEGCAP
- Total Endurance Group Capacity;Group 的總 NVM 容量。
- UEGCAP
- Unallocated Endurance Group Capacity;Group 尚未配置給 Set 的容量。
- DUR
- Data Units Read;Group 累積讀取量,不含控制器內部讀取。
- DUW
- Data Units Written;Group 累積寫入量,不含控制器內部寫入。
- HRC
- Host Read Commands;按所用 I/O Command Set 分類的已完成讀取類命令筆數。
- HWC
- Host Write Commands;已完成的 User Data Out 類命令筆數。
- MUW
- Media Units Written;包含主機與控制器內部寫入的 Group 累積量。
03.01.LID 09h 的 EE、DUR、DUW、MUW 以 1,000,000,000 bytes 為單位並向上取整,0 表示不回報該值。DUR/DUW 不包含控制器內部作業的讀寫,MUW 包含主機與控制器的寫入。HRC/HWC 是已完成命令數;TEGCAP/UEGCAP 是以 bytes 表示的容量,0 同樣表示不回報,不能當作測得的零容量。
- EE
- Endurance Estimate;假設寫入放大為 1 時,Group 全生命週期可寫入量的估計。
來源:Base 2.4 §5.2.13.1.10
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 文件頁 238-239, PDF 頁 264-265
04 選擇哪些警告要列入事件清單
- controller
- controller,實作 NVMe 介面、取走 command 並回報 completion 的控制實體。
- EGEALCN
- Endurance Group Event Aggregate Log Change Notices;FID0Bh 中啟用清單變更通知的位元。
- CDW11
- Command Dword 11;命令中的第 11 個 dword 欄位,其內容依命令而定。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
- CQE
- Completion Queue Entry;控制器寫入完成佇列的一筆命令結果。
- DW0
- Dword 0;此處指完成項目的第 0 個 dword,內容要配合命令種類與 SEL 解讀。
04.01.FID 18h 的 CDW11 低 16 bits 指定 ENDGID,bits 23:16 是 EGCW 通知選擇遮罩,逐 bit 對應 LID 09h 的警告。啟用時若條件已成立,也會產生事件。設定保留警告 bit 或指定不存在的 Group,必須以 Invalid Field in Command 中止;ENDGID=0 不表示全體 Group,這時 EGCW 不使用。
來源:Base 2.4 §5.2.30.1.17
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.17, 文件頁 478, PDF 頁 504
05 從清單找到 Group,而不是從序號猜 Group
| byte位置 | 資料內容 | 讀者應取得的值 |
|---|---|---|
| 0~7 | 03 00 00 00 00 00 00 00 | NUMENT=3 |
| 8~9 | 01 00 | Entry1:ENDGID1 |
| 10~11 | 02 00 | Entry2:ENDGID2 |
| 12~13 | 07 00 | Entry3:ENDGID7 |
| 14~15 | 00 00 | 尾端補零;不是Entry4 |
- Dword
- Dword(Double word);32 bits,也就是 4 bytes。對比 word=16 bits;例如 zero-based dword count=3 代表 4 個 Dwords,也就是 16 bytes。
- NUMD
- Number of Dwords;此處為 NUMDU 與 NUMDL 合併的數值,Get Log Page 採傳輸 dword 數減 1。
05.01.LID 0Fh 是依 ENDGID 遞增排列的待處理清單,不是事件時間序列。前 8 bytes 是 NUMENT,之後每筆 2 bytes。NUMENT 直接表示筆數;最大筆數受 ENDGIDMAX 限制。超過這份 log 結尾的傳輸資料必須補零;只有 NUMENT 指定的項目才是有效清單內容。
- ENDGIDMAX
- Endurance Group Identifier Maximum;合法 ENDGID 的最大值,不是目前 Group 數量。
來源:Base 2.4 §5.2.13.1.15
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.15, 文件頁 270, PDF 頁 296
06 走完通知、讀取與確認的完整流程
06.01.成功讀取某 Group 的 LID 09h 且 RAE=0,會清除該 Group 的待處理事件並移除它在 LID 0Fh 的項目。RAE=1 保留事件,讀取失敗也必須保留。讀取 LID 0Fh 且 RAE=0 則清除清單變更通知,不能代替逐組的 LID09h 確認;確認事件不代表造成警告的狀態已消失。
- RAE
- Retain Asynchronous Event;Get Log Page 的事件保留控制,1 保留、0 在成功完成後確認對應事件。
來源:Base 2.4 §5.2.13.1.15, 3.2.3, 5.2.13, 5.2.2
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.15, 3.2.3, 5.2.13, 5.2.2, 文件頁 84,183-187,213,270, PDF 頁 110,209-213,239,296
開著 Spec 的順向報告路徑
R-1先用本文的全貌與案例說明機制,再按下列 Base PDF 檢視器頁碼往後讀。共用頁從指定標題開始,在停止標題前結束;必要背景已在中文教學說明,不必為每個引用往返翻頁。
| 頁碼順序 | 章節起點 | 重點與停止位置 |
|---|---|---|
| R1 · Base PDF 108–110 | §3.2.3 | 從 Endurance Groups 標題開始,用 Figure 69 說明分組,再講三個操作的關係;不回翻 NVM Set 細節。 在 §3.2.4 前停止。 |
| R2 · Base PDF 209–213 | §5.2.2 | 只補 AER、RAE 與 Figure 151 的三個通知欄位;Figure 155 只讀 06h 這列,到該列說明結束即停止。 在 §5.2.3 前停止。 |
| R3 · Base PDF 235–241 | §5.2.12 | 只補 Get Features 的 SEL、能力回覆,再接 Get Log Page 的 LID、LSI、RAE、NUMD 與 offset;Figure 209 只讀 09h/0Fh。 在 §5.2.13.1 前停止。 |
| R4 · Base PDF 263–265 | §5.2.13.1.10 | 從本節標題開始完整講 Figures 224/225:指定 Group、警告 bit、壽命估計、流量與容量。用 DUW=3 的區間算例。 在 §5.2.13.1.11 前停止。 |
| R5 · Base PDF 296 | §5.2.13.1.15 | 只讀本節及 Figure 261;用 [1,2,7] 算 14-byte 內容與 16-byte 傳輸,再分清逐組項目的移除。 在 §5.2.13.1.16 前停止。 |
| R6 · Base PDF 369–398 | §5.2.14.2.1 | 在 Figure 338 向後依序只找 PDF369 的 OAES bit14、372 的 CTRATT bit4、379 的 AERL、388 的 ENDGIDMAX、398 的 ONCS bit4;跳過其餘欄位,不逐頁朗讀。 在 §5.2.14.2.2 前停止。 |
| R7 · Base PDF 483–485 | §5.2.30 | 只讀 Figure 464 的 FID/SV、Figure 466 的 18h 與 0Bh 列及註腳2;保存能力與目前值不要混在一起。 在 §5.2.30.1.1 前停止。 |
| R8 · Base PDF 492–493 | §5.2.30.1.6 | 在 Figure 474 只讀 EGEALCN bit14 與支援限制,到該 bit 的敘述結束便停止。 在 §5.2.30.1.7 前停止。 |
| R9 · Base PDF 504 | §5.2.30.1.17 | 完整講 FID18h 與 Figure 493,以 00050007h 收束設定例子,再用已畫好的流程連回兩種確認,不向前翻頁。 在 §5.2.30.1.18 前停止。 |
- NVM Set
- 在邏輯上分開的一組非揮發性儲存,可包含數個 namespace。
- CTRATT
- Controller Attributes;控制器能力與屬性的位元欄位。
- offset
- 偏移量;相對起點的位置。byte offset 以 bytes 計距離,index offset 以項目計位置。
- AERL
- Asynchronous Event Request Limit;同時未完成的 AER 上限採數量減 1 編碼。
- OAES
- Optional Asynchronous Events Supported;回報控制器支援哪些選用非同步事件。
- ONCS
- Optional NVM Command Support;包含本篇需要的 Save/Select 支援位元。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
- SEL
- Select;Get Features 選擇目前值、預設值、保存值或支援能力。
- SV
- Save;Set Features 要求保存屬性的控制位元,需確認支援與可保存能力。
學完後想一想
1. DUW=3、MUW=5,能否精確算出主機寫了 3 GB、寫入放大率為 5/3?
08.01.不能。兩欄均以十億 bytes 向上取整,DUW=3 代表大於二十億且不超過三十億 bytes。MUW 也只有區間資訊,因此比值只能作粗略觀察。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 文件頁 238-239, PDF 頁 264-265
2. 把 Group 7 的 FID18h mask 從 05h 改成 01h,LID09h 的可靠度警告會自動消失嗎?
08.02.不會。改的是可靠度警告是否觸發新增清單項目;實際狀態由控制器回報。若重新啟用時狀態仍成立,事件可再次回報。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.30.1.17, 文件頁 478, PDF 頁 504
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 文件頁 238, PDF 頁 264
3. 清單 [1,2,7] 的 index 2 位於 offset 12,查 LID09h 要用哪個 ENDGID?
08.03.用 7。2 是從 0 起算的項目位置,12 是 byte 距離,7 才是讀出的識別值;此 ID 放進 Get Log Page 的 LSI。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.15, 文件頁 270, PDF 頁 296
4. 成功讀取 LID0Fh、RAE=0 後,為何 Group 7 仍在清單?
08.04.這次清除的是清單變更通知。要確認 Group 7 的事件並移除它的項目,須成功讀取 LID09h、ENDGID7、RAE=0;若警告持續,也要考慮再次回報。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.15, 3.2.3, 5.2.13, 5.2.2, 文件頁 84,183-187,213,270, PDF 頁 110,209-213,239,296
5. 收到事件卻讀到 EGCW=0,或看到 PUSED=103,分別可以下什麼結論?
08.05.EGCW=0 只說讀取當時沒有該欄位的警告,不能還原通知當時的狀態;103 表示已超過估計壽命的 100%,不直接表示媒體故障或唯讀。兩者都要按欄位本身的時間與定義解讀。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.13.1.10, 文件頁 238, PDF 頁 264


Comments