NVMe SQ Associations:從儲存歸屬到 I/O 佇列分流

9 minute read

English

00.01.主機知道每筆 I/O 要讀寫哪個 namespace,但控制器也需要知道:這個提交佇列預計服務哪一組儲存空間?SQ Associations 讓主機在建立佇列時提供這項提示。本文把儲存歸屬、佇列配置與命令分流接起來,說明提示何時有幫助,以及為什麼「命令完成」還不足以證明分流正確。

SQ Associations
提交佇列關聯;建立 SQ 時,提示控制器這個佇列預計服務哪個 NVM Set。
namespace
主機以 NSID 指定的一份邏輯儲存空間。
I/O
Input/Output,對 namespace 執行資料輸入與輸出的操作類別。
SQ
Submission Queue,提交佇列;主機放置待執行命令的記憶體佇列。

這篇的主軸

01

看懂三種關係

01-01namespace 屬於哪個 NVM Set,SQ 關聯哪個 Set,完成結果送往哪個 CQ:這三種關係各回答不同問題,不能因為編號接近就混在一起。

NVM Set
在邏輯上與其他集合分開的一組非揮發性儲存,可包含多個 namespace。
NVM
Non-Volatile Memory,斷電後仍能保存資料的記憶體。
CQ
Completion Queue,完成佇列;控制器放置命令完成結果的記憶體佇列。
02

確認提示的前提

02-01先查控制器能力,再分清 Predictable Latency Mode 是否啟用、Set 目前處於哪種工作視窗。支援位元本身沒有提供固定的應用程式延遲上限。

Predictable Latency Mode
可預測延遲模式;以 NVM Set 為單位,在符合操作條件的工作視窗提供確定性讀寫延遲。
03

把儲存清單接到建立命令

03-01讀出 Set 的實際識別值及 namespace 歸屬,再放進 Create I/O SQ。清單索引、byte 位置與識別值各有用途,64 筆佇列也有自己的數量編碼。

04

用每筆 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 把佇列用途告訴控制器

儲存歸屬、工作提示、完成路徑各有一條關係由上往下追蹤。上層是 namespace 的儲存歸屬;中層表示主機為各 SQ 選擇相符的 Set;下層只表示完成結果匯入同一 CQ。這些連線不表示把 namespace 容量搬進主機佇列。來源:Base §3.2.2、§3.3、§5.3.2、§8.1.28。NVM Set 7A: NSID11 · B: NSID12NVM Set 9C: NSID21SQ3 + SQ4NVMSETID = 7SQ5NVMSETID = 9CQ2完成結果共用;Set 歸屬維持不變
由上往下追蹤。上層是 namespace 的儲存歸屬;中層表示主機為各 SQ 選擇相符的 Set;下層只表示完成結果匯入同一 CQ。這些連線不表示把 namespace 容量搬進主機佇列。來源:Base §3.2.2、§3.3、§5.3.2、§8.1.28。
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、PLMSet 7 現在已啟用模式
Set 7 已啟用模式該 Set 使用模式的工作視窗規則此刻必定在 DTWIN
Set 7 目前在 DTWIN現在能在符合條件時提供確定性延遲主機可無限增加工作量,或保證全部 PCIe 延遲
SQ3 已關聯 Set 7控制器收到此 SQ 的預定用途主機之後一定送對每筆 I/O
由支援走到實際效果,中間仍有設定、視窗及主機分流條件。來源:Base §8.1.28、§8.1.21、Figure 338。
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 的對照

清單位置不是 Set 識別值
清單內的索引整份清單的 byte 範圍entry 內的 NSETID建立 SQ 時使用
0128~2557CDW12=00000007h
1256~3839CDW12=00000009h
說明性範例 NUMENT=2。先用位置找到資料,再從資料取識別值;不要把左邊的 0/1 或 128/256 填成 Set ID。來源:Base Figures 344/345/578。
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 與完成佇列

把 64-entry SQ3 的建立參數拆開檢查
命令位置本例如何組成送出的值
CDW10高 16 bits:64−1=63;低 16 bits:QID3003F0003h
CDW11高 16 bits:CQID2;PC=1;QPRIO=000020001h
CDW12低 16 bits:Set 7;高 16 bits 保留00000007h
PRP14 KiB 對齊、已配置的連續主機記憶體0000000000100000h
前提:CQ2 已建立,Set 7 可用且支援 SQA,控制器已初始化且支援此佇列深度;採 round robin,所以 QPRIO 被忽略。來源:Base §5.3.2、Figures 575~578。
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 關聯一致

以命令的 NSID 選 SQ,而不是以 CQID 選儲存空間本例只追蹤 NSID21。SQ3 即使較空,也不符合 Set 9 的提示;兩個 SQ 共用 CQ2 不會改變這個判斷。來源:Base §8.1.28、Figures 346/578。I/O · NSID21Identify namespace → NVMSETID = 9先確認資料對象的儲存歸屬SQ5 → Set 9相符:使用 SQ5SQ3 → Set 7不符:不要選 SQ3
本例只追蹤 NSID21。SQ3 即使較空,也不符合 Set 9 的提示;兩個 SQ 共用 CQ2 不會改變這個判斷。來源:Base §8.1.28、Figures 346/578。

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

採用的規格版本

NVM Express Base Specification, Revision 2.4

Jia-Chang

Jia-Chang

Human

Comments

  Write a comment ...