NVM Express(NVMe)是一種高性能、可擴(kuò)展的接口協(xié)議,用于通過(guò)PCI express(PCIe)總線,實(shí)現(xiàn)主機(jī)軟件與NVM設(shè)備之間的通信。目前,由于NVMe SSD相比于SATA SSD具有更高的吞吐量、更快的訪問(wèn)速度和更低的功耗,已經(jīng)被廣泛應(yīng)用于各種計(jì)算領(lǐng)域和存儲(chǔ)系統(tǒng)。
NVMe隊(duì)列
NVMe協(xié)議采用成對(duì)的提交隊(duì)列(Submission Queue,SQ)和完成隊(duì)列(Completion Queue,CQ)機(jī)制。SQ用于存放提交命令,而CQ則用于存放完成信息。隊(duì)列狀態(tài)信息通過(guò)門(mén)鈴寄存器(Door Bell,DB)來(lái)檢測(cè)。這兩個(gè)隊(duì)列采用了環(huán)形隊(duì)列結(jié)構(gòu),隊(duì)列可以映射到任何PCIe可訪問(wèn)的內(nèi)存中,通常放在主機(jī)側(cè)內(nèi)存。對(duì)于提交隊(duì)列,主機(jī)端是生產(chǎn)者,NVMe SSD是消費(fèi)者。完成隊(duì)列的情況剛好相反。因此SQ Tail指針和CQ Head指針由主機(jī)更新,而其他兩個(gè)指針由NVMe控制器更新。NVMe的隊(duì)列結(jié)構(gòu)如圖1所示。
圖1 隊(duì)列示意圖
NVMe隊(duì)列的深度是固定的,通過(guò)Tail和Head來(lái)分別指向隊(duì)列的首尾位置,隊(duì)列實(shí)際可用的大小是隊(duì)列大小減1,當(dāng)Head條目指針等于Tail條目指針時(shí),隊(duì)列為空。當(dāng)Head條目指針比Tail條目指針多一個(gè)時(shí),隊(duì)列為滿。
NVMe協(xié)議中根據(jù)命令類(lèi)型將隊(duì)列分為了Admin隊(duì)列和I/O隊(duì)列,Admin隊(duì)列用來(lái)緩存管理Admin命令,如獲取SSD屬性、創(chuàng)建I/O隊(duì)列等。而I/O隊(duì)列用來(lái)緩存管理I/O命令,如讀、寫(xiě)、識(shí)別等。在一個(gè)系統(tǒng)中只能有一對(duì)Admin SQ/CQ,但可以存在多對(duì)IO SQ/CQ。Admin SQ/CQ僅用來(lái)進(jìn)行Admin命令的交互,I/O SQ/CQ僅用來(lái)進(jìn)行I/O命令的交互。對(duì)于多核系統(tǒng)來(lái)說(shuō),每個(gè)核內(nèi)雖然只有1個(gè)I/O CQ,但是可以存在多個(gè)I/O SQ,如圖2所示。
圖2 NVMe多隊(duì)列示意圖
由于Host端可能存在多個(gè)流水線,多隊(duì)列的設(shè)計(jì)可以讓系統(tǒng)的性能最大化。同時(shí),可以通過(guò)對(duì)不同的隊(duì)列設(shè)置不同的優(yōu)先級(jí),來(lái)保證高優(yōu)先級(jí)隊(duì)列的命令更快完成。NVMe協(xié)議中規(guī)定Admin SQ/CQ的隊(duì)列深度最大可以支持4096(4K),I/O SQ/CQ的隊(duì)列深度最大可以支持65536(64K)。在一個(gè)實(shí)際設(shè)計(jì)中,SQ的個(gè)數(shù)和深度的設(shè)置可以根據(jù)項(xiàng)目需求和硬件資源進(jìn)行配置。隊(duì)列深度的設(shè)置主要和系統(tǒng)中隊(duì)列消費(fèi)者和生產(chǎn)者之間的速率有關(guān)。
2. NVMe分層結(jié)構(gòu)
NVMe協(xié)議棧結(jié)構(gòu)分為應(yīng)用層和傳輸層兩個(gè)層次。在應(yīng)用層中實(shí)現(xiàn)NVMe命令生成、隊(duì)列管理和流程控制,而傳輸層則借助PCIe協(xié)議進(jìn)行實(shí)現(xiàn)。PCIe協(xié)議分為三層,即事務(wù)層、數(shù)據(jù)鏈路層和物理層。事務(wù)層負(fù)責(zé)將數(shù)據(jù)傳輸請(qǐng)求和響應(yīng)打包成事務(wù)進(jìn)行傳輸,數(shù)據(jù)鏈路層則負(fù)責(zé)數(shù)據(jù)傳輸?shù)目煽啃院土骺刂疲ㄟ^(guò)鏈路層控制器(Link Layer Controller, LLC)實(shí)現(xiàn)。物理層則負(fù)責(zé)物理傳輸,包括電信號(hào)的發(fā)射和接收、時(shí)序控制和線路管理等。其分層結(jié)構(gòu)圖如圖3所示。首先,在應(yīng)用層生成NVMe命令傳輸至事務(wù)層。其次,在事務(wù)層會(huì)對(duì)上層傳輸?shù)臄?shù)據(jù)添加首部和校驗(yàn),封裝成TLP(Transaction Level Packet)傳輸至數(shù)據(jù)鏈路層。然后,在數(shù)據(jù)鏈路層會(huì)對(duì)TLP添加序列號(hào)和校驗(yàn),封裝成DLLP。最后,在物理層對(duì)數(shù)據(jù)包進(jìn)行編碼和并轉(zhuǎn)串處理后,通過(guò)SerDes(Serializer/Deserializer)將數(shù)據(jù)發(fā)送至PCIe鏈路中。
圖3 分層結(jié)構(gòu)
由于NVMe協(xié)議是基于PCIe協(xié)議實(shí)現(xiàn)的,下面通過(guò)在PCIe拓?fù)浣Y(jié)構(gòu)中介紹NVMe協(xié)議中的SQ、CQ和DB的位置,以及數(shù)據(jù)在Host和NVMe SSD之間的傳輸流程。NVMe SSD在PCIe拓?fù)浣Y(jié)構(gòu)中的位置如圖4所示。
圖4 PCIe拓?fù)浣Y(jié)構(gòu)
PCIe的拓?fù)浣Y(jié)構(gòu)由三部分組成,根聯(lián)合體(Root Complex, RC)、PCIe交換器(PCIe Switch)和端點(diǎn)(Endpoint, EP)。根聯(lián)合體位于拓?fù)浣Y(jié)構(gòu)的根部,最靠近CPU。端點(diǎn)設(shè)備位于PCIe的端末。交換機(jī)位于根聯(lián)合體和端點(diǎn)設(shè)備之間。PCIe使用串行鏈路連接,一個(gè)鏈路的兩端只能有兩個(gè)設(shè)備。因此PCIe需要通過(guò)PCIe Switch擴(kuò)展PCIe鏈路后,才能連接多個(gè)EP設(shè)備。在NVMe存儲(chǔ)結(jié)構(gòu)中,NVMe SSD也作為PCIe的一個(gè)EP端掛載在RC上。
NVMe協(xié)議中的SQ和CQ位于Host內(nèi)存中,主機(jī)在初始化時(shí)根據(jù)隊(duì)列的個(gè)數(shù)和深度在主機(jī)內(nèi)存開(kāi)辟出相應(yīng)的內(nèi)存空間,來(lái)存放SQ、CQ命令。DB寄存器位于NVMe SSD中,且被映射到BAR(Base Address Register)空間中,Host可以通過(guò)訪問(wèn)BAR空間來(lái)更新DB寄存器的值。
當(dāng)Host需要向NVMe SSD發(fā)送命令時(shí),首先將命令存放在主機(jī)內(nèi)存開(kāi)辟的SQ區(qū)域中,其次通過(guò)訪問(wèn)BAR空間的DB寄存器來(lái)告訴NVMe SSD到主機(jī)端內(nèi)存區(qū)域取走待執(zhí)行的命令。待命令執(zhí)行完成后,NVMe SSD向主機(jī)內(nèi)存的CQ區(qū)域?qū)懭胪瓿擅睢?/p>
3. NVMe數(shù)據(jù)結(jié)構(gòu)
NVMe協(xié)議中規(guī)定每個(gè)提交命令的大小為64字節(jié),完成命令大小為16字節(jié),NVMe命令分為Admin和IO兩類(lèi),NVMe的數(shù)據(jù)塊組織方式有PRP和SGL兩種。提交命令的格式如圖5所示。
圖5 提交命令數(shù)據(jù)格式
NVMe提交命令的數(shù)據(jù)格式屬性如下:
(1)Opcode(OPC):命令操作碼,不同操作命令的Opcode都有對(duì)應(yīng)的值;
(2)Fused Operation(FUSE):融合操作,可選字段,用于將兩個(gè)命令融合為一條命令;
(3)PRP or SGL for Data Transfer(PSDT):PRP或SGL數(shù)據(jù)傳輸;
(4)Command Identifier(CID):命令I(lǐng)D;
(5)Namespace Identifier(NSID):命名空間ID;
(6)Metadata Pointer(MPTR):元數(shù)據(jù)指針;
(7)PRP Entry 1/2:物理區(qū)域頁(yè)項(xiàng);
(8)SGL Entry:散列聚合列表。
Admin命令集定義了可以提交到Admin SQ的命令。NVM命令集定義了可以提交到IO SQ的命令。表1和表2分別列出了Admin命令集和NVM命令集中的常用命令、操作碼和簡(jiǎn)要的功能描述。
表1Admin命令集
命令 | 必選/可選 | Opcode | 功能 |
刪除I/O提交隊(duì)列 | 必選 | 00h | 刪除I/O提交隊(duì)列 |
創(chuàng)建I/O提交隊(duì)列 | 必選 | 01h | 創(chuàng)建I/O提交隊(duì)列 |
刪除I/O完成隊(duì)列 | 必選 | 03h | 刪除I/O完成隊(duì)列 |
創(chuàng)建I/O完成隊(duì)列 | 必選 | 04h | 創(chuàng)建I/O完成隊(duì)列 |
識(shí)別 | 必選 | 05h | 返回描述設(shè)備的信息 |
設(shè)置特性 | 必選 | 07h | 設(shè)置SSD控制器特性 |
獲取特性 | 必選 | 08h | 讀取SSD控制器特性 |
獲取日志頁(yè) | 必選 | 02h | 讀取日志頁(yè)表,如SMART日志 |
命令空間管理 | 可選 | 0Ah | 管理命令空間,如創(chuàng)建和刪除操作 |
表2NVMe命令集
命令 | 必選/可選 | Opcode | 功能 |
清除 | 必選 | 00h | 將緩存內(nèi)容刷新至非易失性存儲(chǔ)器 |
寫(xiě) | 必選 | 01h | 將數(shù)據(jù)寫(xiě)入指定邏輯塊 |
讀 | 必選 | 02h | 從指定邏輯塊讀取數(shù)據(jù) |
寫(xiě)入不可糾正的錯(cuò)誤 | 必選 | 03h | 標(biāo)記范圍內(nèi)的邏輯塊無(wú)效 |
寫(xiě)入全0 | 可選 | 05h | 將指定的邏輯塊值設(shè)置為0 |
數(shù)據(jù)集管理 | 可選 | 06h | 指定邏輯塊屬性 |
接下來(lái)介紹NVMe協(xié)議中的尋址方式。在NVMe協(xié)議中定義了兩種尋址方式,PRP和SGL。通過(guò)PRP和SGL來(lái)記錄Host內(nèi)存中物理頁(yè)的位置。NVMe命令中的PRP和SGL字段用來(lái)向NVMe SSD傳遞將要讀寫(xiě)數(shù)據(jù)在內(nèi)存中的位置。NVMe協(xié)議中規(guī)定Admin命令只能通過(guò)PRP告訴NVMe SSD命令在內(nèi)存中物理地址。而SGL主要是在NVMeoF中使用,因此本設(shè)計(jì)將采用PRP尋址方式。
Host可以通過(guò)配置NVMe Controller的CC.MPS寄存器來(lái)設(shè)定物理頁(yè)的大小,物理頁(yè)的大小可設(shè)定的范圍是4KB~128MB之間。物理頁(yè)對(duì)應(yīng)的地址記錄在PRP Entry中,PRP Entry的數(shù)據(jù)格式。PRP Entry的數(shù)據(jù)格式由物理頁(yè)起始地址和頁(yè)偏移地址兩部分組成,如圖6所示。由于物理地址只能是四字節(jié)對(duì)齊,因此將偏移地址的最低2bit置為0。此外,圖6中n的取值與設(shè)置的物理頁(yè)大小有關(guān),例如,將物理頁(yè)大小設(shè)置為4KB,則n=11,通過(guò)偏移地址[11:2]來(lái)表示在一個(gè)內(nèi)存頁(yè)內(nèi)的偏移地址。
圖6 PRP Entry格式
一個(gè)PRP Entry只能指向一個(gè)物理頁(yè)。NVMe協(xié)議中只定義了兩個(gè)PRP Entry,當(dāng)傳輸數(shù)據(jù)量大小大于兩個(gè)內(nèi)存頁(yè)大小時(shí),PRP Entry2將不指向物理頁(yè),而是指向由若干個(gè)PRP組成的PRP List。如圖7所示,NVMe命令中的PRP1指向第一個(gè)內(nèi)存頁(yè),PRP2指向一個(gè)新的PRP鏈表的首地址。如果需要指定更大的內(nèi)存空間可以通過(guò)每一個(gè)PRP List的最后一個(gè)PRP Entry指向新的PRP List。
圖7 PRP原理示意圖
完成命令的數(shù)據(jù)格式如圖8所示。
圖8 完成命令數(shù)據(jù)格式
NVMe完成隊(duì)列的命令格式屬性如下:
(1)SQ Header pointer:SQ頭指針;
(2)SQ Identifier:SQ ID;
(3)Command Identifier:命令I(lǐng)D;
(4)P:相位標(biāo)志phase tag,完成隊(duì)列沒(méi)有head/tail交互,通過(guò)相位標(biāo)志實(shí)現(xiàn)完成隊(duì)列項(xiàng)的釋放;
(5)Status Field:狀態(tài)域。
NVMe工作流程
NVMe協(xié)議中的Admin命令和IO命令執(zhí)行流程相同,主要通過(guò)SQ、CQ和DB寄存器三個(gè)關(guān)鍵部件之間的相互協(xié)作來(lái)完成。NVMe的命令處理流程分為了8個(gè)步驟,如圖9所示。
圖9 NVMe命令處理流程
Host和SSD之間通過(guò)更新DB(DoorBell)寄存器的值來(lái)實(shí)現(xiàn)隊(duì)列信息的交互。每個(gè)SQ和CQ都擁有一個(gè)Head寄存器和Tail寄存器。對(duì)于SQ而言,Host是生產(chǎn)者,負(fù)責(zé)向隊(duì)列發(fā)送提交命令,SSD是消費(fèi)者,負(fù)責(zé)執(zhí)行命令,因此Host負(fù)責(zé)更新Tail DB寄存器,SSD負(fù)責(zé)更新Head DB寄存器。對(duì)于CQ而言,SSD是生產(chǎn)者,負(fù)責(zé)向隊(duì)列發(fā)送完成命令,Host是消費(fèi)者,負(fù)責(zé)檢查完成信息,因此SSD負(fù)責(zé)更新Tail DB寄存器,Host負(fù)責(zé)更新Head DB寄存器。而DB寄存器都存在于SSD內(nèi),且只能進(jìn)行寫(xiě)操作,不能進(jìn)行讀操作。因此NVMe協(xié)議中規(guī)定SSD通過(guò)完成信息向Host反饋CQ Tail和SQ Head寄存器的值。
NVMe命令處理的步驟如下:
(1)主機(jī)提交新的NVMe命令。主機(jī)生成新的NVMe命令并添加ID號(hào)后,將其存放在SQ Tail指針指向的內(nèi)存空間中;
(2)主機(jī)更新SQ Tail DB寄存器。主機(jī)通過(guò)Memory Write事務(wù)更新SQ Tail DB寄存器的值,以通知NVMe SSD控制器去主機(jī)端讀取SQ中緩存的命令;
(3)NVMe SSD讀取命令。NVMe SSD控制器檢測(cè)到SQ Tail DB寄存器的變化后,通過(guò)Memory Read事務(wù)去讀取SQ內(nèi)緩存的命令,這個(gè)過(guò)程,NVMe SSD進(jìn)行突發(fā)讀取,一次讀取多條命令,等待取命令完成后更新SQ Head DB寄存器的值;
(4)NVMe SSD執(zhí)行命令。NVMe SSD控制器根據(jù)內(nèi)部的仲裁機(jī)制來(lái)執(zhí)行讀取到的NVMe命令,其執(zhí)行過(guò)程并不是按照隊(duì)列的先后順序來(lái)執(zhí)行命令;
(5)NVMe SSD控制器將完成命令寫(xiě)入CQ。NVMe SSD控制器將NVMe命令的執(zhí)行結(jié)果寫(xiě)入主機(jī)的CQ內(nèi)存區(qū)域中,完成命令包括NVMe命令中的ID號(hào)和SQ Head DB寄存器的值;
(6)NVMe SSD通知主機(jī)檢查完成命令。NVMe SSD控制器通過(guò)Memory Write事務(wù)向主機(jī)發(fā)出MSI-X中斷信號(hào),告知主機(jī)檢查CQ中的完成信息。在本設(shè)計(jì)中,取消了完成隊(duì)列的設(shè)計(jì),而采用FPGA的并行處理方式,通過(guò)主機(jī)端實(shí)時(shí)監(jiān)測(cè)CQ信息,以節(jié)省硬件資源和提高NVMe命令處理速度;
(7)主機(jī)檢查完成命令。主機(jī)從CQ內(nèi)存中讀取完成信息,并根據(jù)狀態(tài)字段判斷NVMe命令的執(zhí)行情況。若命令已經(jīng)執(zhí)行完成,主機(jī)會(huì)釋放該ID號(hào)對(duì)應(yīng)的提交命令空間,以便給新的命令使用;
(8)主機(jī)更新CQ Head DB寄存器。主機(jī)通過(guò)Memory Write事務(wù)更新CQ Head DB寄存器的值,以通知NVMe SSD控制器CQ中的完成信息已經(jīng)檢查。
對(duì)相關(guān)NVM安e設(shè)計(jì)感興趣的可以看本博客,更多的見(jiàn)csdn用戶(hù): tiantianuser
或視頻見(jiàn)B站 用戶(hù): 專(zhuān)注與守望
審核編輯 黃宇
-
PCIe
+關(guān)注
關(guān)注
16文章
1310瀏覽量
84571 -
協(xié)議分析
+關(guān)注
關(guān)注
0文章
8瀏覽量
7659 -
nvme
+關(guān)注
關(guān)注
0文章
241瀏覽量
23094
發(fā)布評(píng)論請(qǐng)先 登錄
NVMe SSD性能影響因素分析

Xilinx FPGA NVMe Host Controller IP,NVMe主機(jī)控制器
Xilinx FPGA高性能NVMe SSD主機(jī)控制器,NVMe Host Controller IP
高性能NVMe主機(jī)控制器,Xilinx FPGA NVMe Host Accelerator IP
NVME控制器設(shè)計(jì)1
NVMe協(xié)議簡(jiǎn)要分析
NVMe協(xié)議簡(jiǎn)介2
NVMe協(xié)議訪問(wèn)能釋放存儲(chǔ)級(jí)內(nèi)存性能和存儲(chǔ)系統(tǒng)的創(chuàng)新
如何選擇合適的NVMe-over-Fabrics方案

PCIe Gen 4協(xié)議分析儀的竟然那么強(qiáng)大!
NVMe over Fabrics的優(yōu)勢(shì)是什么?
揭開(kāi)M.2接口的神秘面紗:NVMe協(xié)議與SATA協(xié)議的差異
【虹科干貨】FC-NVMe 介紹及性能分析

Emulex引導(dǎo)的光纖通道和NVMe FC協(xié)議用戶(hù)指南 14.2版

評(píng)論