NVMe SQ Associations:從儲存歸屬到 I/O 佇列分流
00.01.主機知道每筆 I/O 要讀寫哪個 namespace,但控制器也需要知道:這個提交佇列預計服務哪一組儲存空間?SQ Associations 讓主機在建立佇列時提供這項提示。本文把儲存歸屬、佇列配置與命令分流接起來,說明提示何時有幫助,以及為什麼「命令完成」還不足以證明分流正確。
- SQ Associations
- 提交佇列關聯;建立 SQ 時,提示控制器這個佇列預計服務哪個 NVM Set。
- namespace
- 主機以 NSID 指定的一份邏輯儲存空間。
- I/O
- Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
- SQ
- Submission Queue,提交佇列;主機放置待執行命令的記憶體佇列。
這篇的主軸
看懂三種關係
01-01namespace 屬於哪個 NVM Set,SQ 關聯哪個 Set,完成結果送往哪個 CQ:這三種關係各回答不同問題,不能因為編號接近就混在一起。
- NVM Set
- 在邏輯上與其他集合分開的一組非揮發性儲存,可包含多個 namespace。
- NVM
- Non-Volatile Memory,斷電後仍能保存資料的記憶體。
- CQ
- Completion Queue,完成佇列;控制器放置命令完成結果的記憶體佇列。
確認提示的前提
02-01先查控制器能力,再分清 Predictable Latency Mode 是否啟用、Set 目前處於哪種工作視窗。支援位元本身沒有提供固定的應用程式延遲上限。
- Predictable Latency Mode
- 可預測延遲模式;以 NVM Set 為單位,在符合操作條件的工作視窗提供確定性讀寫延遲。
把儲存清單接到建立命令
03-01讀出 Set 的實際識別值及 namespace 歸屬,再放進 Create I/O SQ。清單索引、byte 位置與識別值各有用途,64 筆佇列也有自己的數量編碼。
用每筆 I/O 檢查分流
04-01從命令 NSID 找到 Set,再選已關聯該 Set 的 SQ。比較建立參數錯誤與後續送錯佇列,理解規格對兩者規定的不同後果。
- NSID
- Namespace Identifier;I/O 命令用來指定 namespace 的識別值。
00.02.預備知識是 OS、Computer Organization 與基本 SSD 概念。本文的 Set 7/9、SQ3/4/5、CQ2 與 namespace 編號均為說明性範例;能力與可用編號以裝置實際回覆為準。
00.03.從「這筆 I/O 應送到哪個佇列」出發,先建立全貌,再逐步追蹤查詢、欄位與結果。
把主軸連起來
00.04.同一組例子貫穿本文:namespace A、B 在 Set 7,C 在 Set 9。主機讓 SQ3、SQ4 服務 Set 7,SQ5 服務 Set 9,而完成結果可以共用 CQ2。讀完應能說明每個編號從哪裡取得、填在哪裡,以及後續怎樣選對 SQ。
00.05.SQ Associations 是配合 Predictable Latency Mode 的選用提示。提示是否受支援、提示是否正確、模式當下能提供什麼服務品質,需要分別確認。
01 把佇列用途告訴控制器
- NVMSETID
- NVM Set Identifier;Set 的 16-bit 識別值,和 SQ 編號、NSID 都不同。
01.01.SQ Associations 讓主機在建立 I/O Submission Queue 時,提供該 SQ 對應的 NVM Set,作為控制器在 Predictable Latency Mode 下改善效能的提示。這是選用能力;Predictable Latency Mode 不依賴主機一定使用 SQ Associations。
來源:Base 2.4 §8.1.28
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759
02 支援能力、模式狀態與工作視窗
| 觀察到的資訊 | 足以說明什麼 | 還不能據此推出什麼 |
|---|---|---|
| CTRATT 三個 bit 為 1 | 控制器支援 SQA、NVM Sets、PLM | Set 7 現在已啟用模式 |
| Set 7 已啟用模式 | 該 Set 使用模式的工作視窗規則 | 此刻必定在 DTWIN |
| Set 7 目前在 DTWIN | 現在能在符合條件時提供確定性延遲 | 主機可無限增加工作量,或保證全部 PCIe 延遲 |
| SQ3 已關聯 Set 7 | 控制器收到此 SQ 的預定用途 | 主機之後一定送對每筆 I/O |
- CTRATT
- Controller Attributes;Identify Controller 中由多個能力 bit 組成的屬性欄位。
- DTWIN
- Deterministic Window;Set 可以提供確定性讀寫延遲的工作視窗。
- PCIe
- PCI Express,NVMe memory-based controller 使用的 transport 與裝置互連。
- PLM
- Predictable Latency Mode;CTRATT 中表示是否支援可預測延遲模式的 bit。
- SQA
- SQ Associations;CTRATT 中表示是否支援提交佇列關聯的 bit。
02.01.支援 SQ Associations 的控制器必須在 CTRATT 同時宣告 SQA、NVM Sets 與 Predictable Latency Mode 支援。這些支援位元不表示每個 Set 目前都已啟用模式,也不表示目前處於可提供確定性延遲的視窗。
來源:Base 2.4 §8.1.28
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759
03 先建立 namespace 到 Set 的對照
| 清單內的索引 | 整份清單的 byte 範圍 | entry 內的 NSETID | 建立 SQ 時使用 |
|---|---|---|---|
| 0 | 128~255 | 7 | CDW12=00000007h |
| 1 | 256~383 | 9 | CDW12=00000009h |
- NSETID
- NVM Set Identifier;NVM Set Attributes Entry 內對 Set 識別欄位使用的縮寫。
- NUMENT
- Number of Entries;這份清單中實際回傳的項目數。
- entry
- 清單中的一筆資料;此處每筆 NVM Set Attributes Entry 為 128 bytes。
- CDW
- CDW(Command Dword);命令中的 32-bit 欄位單位,例如 CDW10 的 10 是欄位 index,不是 byte offset。
03.01.主機需要兩份資訊:NVM Set List 說明控制器可存取哪些 Set,Identify Namespace 則說明指定 namespace 屬於哪個 Set。清單位置、NVM Set Identifier 與 NSID 是不同數值,不能用同一個編號代替。
來源:Base 2.4 §5.2.14.2.4
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, 文件頁 388-389, PDF 頁 414-415
04 建立 SQ 時,同時指定 Set 與完成佇列
| 命令位置 | 本例如何組成 | 送出的值 |
|---|---|---|
| CDW10 | 高 16 bits:64−1=63;低 16 bits:QID3 | 003F0003h |
| CDW11 | 高 16 bits:CQID2;PC=1;QPRIO=0 | 00020001h |
| CDW12 | 低 16 bits:Set 7;高 16 bits 保留 | 00000007h |
| PRP1 | 4 KiB 對齊、已配置的連續主機記憶體 | 0000000000100000h |
- round robin
- 輪詢仲裁;輪流從佇列選取待處理命令,本例不使用加權優先級。
- QPRIO
- Queue Priority;僅在指定的加權輪詢仲裁機制下使用的 SQ 優先級。
- PRP1
- PRP Entry 1;本命令依 PC 選擇存放 SQ 基底位址或 PRP List 位址。
- PC
- Physically Contiguous;1 表示 SQ 的記憶體實體連續,0 表示用頁面清單描述。
04.01.Create I/O Submission Queue 的 CDW12.NVMSETID 建立 SQ 與 Set 的關聯;CDW11.CQID 則指定完成結果送往哪個 CQ。兩個欄位用途不同。NVMSETID=0 或不支援 SQA 時不建立特定 Set 關聯;SQA 支援時指定清單外的非零 Set,命令必須以 Invalid Field in Command 中止。
- CQID
- Completion Queue Identifier;這個 SQ 的完成項目要送往哪個 CQ。
來源:Base 2.4 §5.3.2
來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557
05 讓每筆 I/O 的 Set 與 SQ 關聯一致
05.01.要取得 SQ Associations 的效益,主機必須把每個 I/O SQ 關聯到某個 NVM Set,並只把命令送入與該命令 NSID 所屬 Set 相符的 SQ。不遵守操作規則可能影響 Predictable Latency;這不是一個由本節定義的強制拒絕其他 Set 命令的存取保護機制。
來源:Base 2.4 §8.1.28
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759
開著 Spec 的順向報告路徑
R-1先用本文的全貌與案例說明機制,再按下列 Base PDF 檢視器頁碼往後讀。共用頁從指定標題開始,在停止標題前結束;必要背景已在中文教學說明,不必為每個引用往返翻頁。
| 頁碼順序 | 章節起點 | 重點與停止位置 |
|---|---|---|
| R1 · Base PDF 363–365 | §5.2.14 | 只讀 Figures 333/334 的 CNS 與 CNSSID,再用 Figure 336 的 01h/04h/08h 三列說明三種查詢;到表格註腳即停止,不展開其他 CNS。 在 §5.2.14.1 前停止。 |
| R2 · Base PDF 370–372 | §5.2.14.2.1 | 在 Figure 338 只找 bytes 99:96 的 CTRATT,讀 SQA bit 8、PLM bit 5、NSETS bit 2。讀完這三個 bit 就停止,不讀完整 Identify Controller 表。 在 §5.2.14.2.2 前停止。 |
| R3 · Base PDF 414–415 | §5.2.14.2.4 | 從 NVM Set List 標題起,用兩筆 Set 7/9 說明起始 ID、NUMENT 與 entry;分清 128-byte 步距和實際 Set ID。 在 §5.2.14.2.5 前停止。 |
| R4 · Base PDF 416–419 | §5.2.14.2.8 | 先確認 active NSID 的回覆條件,再直接在 Figure 346 找 bytes 11:10 的 NVMSETID 與相鄰 ENDGID;讀完歸屬欄即停止。 在 §5.2.14.2.9 前停止。 |
| R5 · Base PDF 555–557 | §5.3.2 | 以 SQ3、CQ2、Set 7 串起 Figures 575~579;重點在 CDW12 與 CDW11 不同用途,以及非法 Set 的建立結果。 在 §5.3.3 前停止。 |
| R6 · Base PDF 708–709 | §8.1.21 | 只補模式開頭、Figure 751 與 §8.1.21.1 的操作條件;在 Figure 752 前停止。視窗名稱與模式啟用分開,不展開完整模式設定。 在 §8.1.21.2 前停止。 |
| R7 · Base PDF 758–759 | §8.1.28 | 從 Submission Queue (SQ) Associations 標題開始,最後完整講主範圍:選用提示、支援前提、建立時關聯,以及兩項主機分流規則。 在 §8.1.29 前停止。 |
- CNSSID
- CNS Specific Identifier;用途由 CNS 選項決定的識別欄位。
- ENDGID
- Endurance Group Identifier;Set 或 namespace 所屬耐用度群組的識別值。
- CNS
- Controller or Namespace Structure;Identify 用來選擇回覆哪種資料的欄位。
學完後想一想
1. CTRATT 的三個相關 bit 都是 1,能否直接保證下一筆 Read 的完成時間?
07.01.不能。它們只表示支援能力。還要確認目標 Set 的模式已啟用、目前的工作視窗與操作限制;而服務品質描述也不包括 PCIe 連線的全部延遲。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 732-733, PDF 頁 758-759
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.21, 文件頁 682-683, PDF 頁 708-709
2. 清單 Entry 1 的 NSETID=9,建立 SQ 時填 1、256,還是 9?
07.02.填 9。1 是索引;256 是該筆相對整份清單起點的 byte 位置;9 才是要填入 CDW12 的 Set 識別值。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.2.14.2.4, 文件頁 388-389, PDF 頁 414-415
來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557
3. NSID21 屬於 Set 9,SQ3 與 SQ5 都使用 CQ2,是否可以任選一個 SQ?
07.03.依本例應選關聯 Set 9 的 SQ5。共用 CQ 只代表完成結果送到相同地方,不能改變 SQ3 關聯 Set 7 的事實。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759
來源:NVME-BASE-2.4, Rev. 2.4, §3.3, 文件頁 88, PDF 頁 114
4. 把 NVMSETID 設為 0,是建立通往所有 Set 的共同提示嗎?
07.04.不是。Create I/O SQ 把 0 定義為沒有特定 Set 關聯;它不能滿足本篇「先建立關聯,再按 Set 分流」的提示使用方式。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759
5. Set 9 的命令送到關聯 Set 7 的 SQ,而且成功完成,是否表示主機使用正確?
07.05.不表示。送錯 SQ 違反分流規則,可能影響可預測延遲;§8.1.28 沒有要求每次都用錯誤碼拒絕。這與建立 SQ 時填入清單外非零 Set、必須回 Invalid Field in Command 的規則不同。
來源
來源:NVME-BASE-2.4, Rev. 2.4, §8.1.28, 文件頁 733, PDF 頁 759
來源:NVME-BASE-2.4, Rev. 2.4, §5.3.2, 文件頁 529-531, PDF 頁 555-557


Comments