與此同時(shí),為了節(jié)約系統(tǒng)交互,在NVMe over Fabrics協(xié)議中,完成隊(duì)列沒(méi)有使用流控機(jī)制,因此需要接收端有足夠容納所有已經(jīng)發(fā)出去的命令的完成隊(duì)列空間,來(lái)容納所有完成請(qǐng)求。
一次IO的傳輸過(guò)程如下圖所示:
由于發(fā)送請(qǐng)求和完成請(qǐng)求可以直接攜帶數(shù)據(jù),從而降低互聯(lián)中消耗的交互時(shí)間。如果不需要請(qǐng)求中攜帶數(shù)據(jù),也可以由Target端在過(guò)程中直接從Initiator端獲得相應(yīng)的數(shù)據(jù),如下圖所示。
通過(guò)上述機(jī)制,NVMe over Fabrics協(xié)議實(shí)現(xiàn)了對(duì)于NVMe協(xié)議的命令和數(shù)據(jù)傳輸?shù)臄U(kuò)展。普通的NVMe命令都可以通過(guò)這套機(jī)制映射,NVMe的標(biāo)準(zhǔn)命令搖身一變,就成為了互聯(lián)協(xié)議的命令。不過(guò)還是有一些場(chǎng)景是需要特殊考慮的,為了支持這些場(chǎng)景,協(xié)議擴(kuò)展了NVMe命令,增加了與互聯(lián)相關(guān)的5個(gè)命令:Connect,Property Get/ Set,Authentication Send/ Receive。Authentication Send/ Receive主要用于做Initiator端和Target端的安全協(xié)議的傳遞,服從SPC-4。下面重點(diǎn)說(shuō)一說(shuō)Connect和Property Get/ Set。
在NVMe over Fabrics協(xié)議中,約定每個(gè)發(fā)送隊(duì)列都與一個(gè)接收隊(duì)列對(duì)應(yīng),不允許多個(gè)發(fā)送隊(duì)列使用同一個(gè)接收隊(duì)列。發(fā)送接收隊(duì)列對(duì)是通過(guò)Connect命令來(lái)創(chuàng)建的。Connect命令攜帶有Host NQN,NVM Subsystem NQN和Host Identifier信息,并且可以指定連接到一個(gè)靜態(tài)的控制器,或者連接到一個(gè)動(dòng)態(tài)的控制器。一個(gè)主機(jī)可以通過(guò)不同的Host NQN或不同的Fabric Port建立到一個(gè)NVM Subsystem的多重連接。這種靈活性賦予了NVMe over Fabrics極大的靈活性。按照協(xié)議規(guī)定,同一個(gè)控制器的所有發(fā)送接收隊(duì)列對(duì)既可以共享底層的互聯(lián)通道,也可以分別獨(dú)占一格底層互聯(lián)通道,方便根據(jù)傳輸層的特點(diǎn)來(lái)進(jìn)行靈活的選擇。
在NVMe協(xié)議中,控制器是一個(gè)代表與主機(jī)進(jìn)行溝通的接口實(shí)體。由于PCIe協(xié)議是一種樹(shù)狀拓?fù)浣Y(jié)構(gòu),因此一旦控制器所處的PCIe Port定下來(lái)后,接口所關(guān)聯(lián)的控制器就完全定下來(lái)了。而對(duì)于NVMe over Fabrics協(xié)議來(lái)說(shuō),一個(gè)Fabric的Port可以嵌入多個(gè)控制器,因此根據(jù)需要不同,可以選擇實(shí)現(xiàn)靜態(tài)控制器或動(dòng)態(tài)控制器。動(dòng)態(tài)控制器是一種簡(jiǎn)單的模型,適用于對(duì)主機(jī)具有相同的服務(wù)特性的需求。靜態(tài)控制器則適用于有不同需要的場(chǎng)景,Initiator可以查詢(xún)了解一個(gè)Fabric Port內(nèi)部包含的靜態(tài)控制器各自的能力,然后選擇連接到指定的控制器以滿(mǎn)足自身的需要。
在經(jīng)典的NVMe協(xié)議中,PCIe空間的BAR0(BAR1)描述了一段內(nèi)存空間用于對(duì)控制器進(jìn)行基本的寄存器級(jí)別的配置。由于Fabrics結(jié)構(gòu)沒(méi)有等效的實(shí)現(xiàn),因此NVMe over Fabrics協(xié)議定義了Property Get/ Set分別表示對(duì)于控制器端的寄存器讀取和寫(xiě)入動(dòng)作。
至此,NVMe的標(biāo)準(zhǔn)操作就完全被準(zhǔn)確和高效地映射成互聯(lián)網(wǎng)絡(luò)所對(duì)應(yīng)的使用方式了。為了能滿(mǎn)足互聯(lián)網(wǎng)絡(luò)的發(fā)現(xiàn)機(jī)制,NVMe over Fabrics協(xié)議定義了發(fā)現(xiàn)服務(wù),用于讓Initiator主動(dòng)發(fā)現(xiàn)NVM Subsystem和對(duì)應(yīng)的可訪(fǎng)問(wèn)的名字空間。這個(gè)服務(wù)還同時(shí)用于支持多路徑功能。該功能依賴(lài)于一個(gè)特殊的配置成支持發(fā)現(xiàn)服務(wù)的NVMe Subsystem。Initiator可以連接到該服務(wù)器并使用Discovery Log Page命令來(lái)獲取可用的資源。
與NVMe over Fabrics協(xié)議一同發(fā)布的,還有一份在Linux平臺(tái)上實(shí)現(xiàn)的基于RDMA和FC傳輸層的NVMe協(xié)議的Initiator和Target端的參考代碼。這份代碼不僅僅包含了協(xié)議的驅(qū)動(dòng)實(shí)現(xiàn),也包含了對(duì)應(yīng)的CLI工具和Linux OS集成支持。相信對(duì)整個(gè)生態(tài)圈來(lái)說(shuō)這會(huì)是一個(gè)良好的開(kāi)端。在剛剛落下帷幕的DCTC2016數(shù)據(jù)中心技術(shù)大會(huì)中,我們也看到了業(yè)界對(duì)于此方案的良好的興趣。其中Broadcom高級(jí)架構(gòu)師Frankie介紹了下一代NVMe Over Fabrics 存儲(chǔ)架構(gòu)、以太網(wǎng)控制器及 SoC的設(shè)計(jì)。Xilinx的展示更加直接揭示了借助Xilinx的FPGA的硬件加速,NVMe over Fabrics在RoCE網(wǎng)絡(luò)上提供了僅有10us的極低延遲時(shí)延。
可以說(shuō),行業(yè)的熱情是對(duì)于NVMe over Fabrics協(xié)議的最好的回應(yīng)??梢灶A(yù)見(jiàn),隨著Flash成本的持續(xù)下降和集成密度的持續(xù)增加,隨著新型基于相變存儲(chǔ)的存儲(chǔ)介質(zhì)的出現(xiàn)和應(yīng)用,隨著業(yè)界對(duì)于閃存定義存儲(chǔ)和存儲(chǔ)虛擬化的需求的強(qiáng)化,NVMe over Fabrics必將在高性能存儲(chǔ)以及數(shù)據(jù)中心中發(fā)揮越來(lái)越大的價(jià)值。