當前位置:
首頁 > 科技 > 關於NVMe over Fabric協議和IO流程

關於NVMe over Fabric協議和IO流程

這篇文章將深入NVMe over Fabric內部,探究其設計思路及其規範下IO的傳輸過程。對於NVMe over Fabrics協議來說,要解決下面幾個問題:

提供對於不同互聯透明的消息和數據的封裝格式;

將NVMe進行操作所需要的介面方式映射到互聯網路;

解決互聯網路的節點發現、多路徑等互聯引入的新問題。

針對數據封裝,協議定義了一整套封裝方案。與傳統的NVMe協議相比,這套封裝方案針對互聯做了一些調整和適配。NVMe定義了一套非同步的由軟體驅動硬體執行相應動作的非同步操作機制,發送和完成包僅僅攜帶必要的描述,而真正的數據和SGL描述符都是放在內存中並且由硬體通過DMA方式取得的。

這是基於PCIe的DMA操作延遲很短(1us)的前提而設計的。在互聯協議中,節點之間的交互時間大大增加,為了降低兩個節點之間不必要的交互,發送請求可以直接攜帶附加的數據或SGL描述符,完成請求也可以攜帶需要回傳的數據,節約了兩者之間交互的負擔。

與此同時,為了節約系統交互,在NVMe over Fabrics協議中,完成隊列沒有使用流控機制,因此需要接收端有足夠容納所有已經發出去的命令的完成隊列空間,來容納所有完成請求。一次IO的傳輸過程如下圖所示:

Initiator端驅動程序封裝發送請求並派發給硬體;

Initiator端硬體將發送請求發到Target端的發送隊列;

Target端控制器處理完成IO請求,並準備出來完成請求派發給硬體;

Target端硬體將完成請求發到Initiator端的接收隊列。

由於發送請求和完成請求可以直接攜帶數據,從而降低互聯中消耗的交互時間。如果不需要請求中攜帶數據,也可以由Target端在過程中直接從Initiator端獲得相應的數據,如下圖所示。

通過上述機制,NVMe over Fabrics協議實現了對於NVMe協議的命令和數據傳輸的擴展。普通的NVMe命令都可以通過這套機制映射,NVMe的標準命令搖身一變,就成為了互聯協議的命令。不過還是有一些場景是需要特殊考慮的,為了支持這些場景,協議擴展了NVMe命令,增加了與互聯相關的5個命令:

Connect

Property Get/ Set

Authentication Send/ Receive

Authentication Send/Receive主要用於做Initiator端和Target端的安全協議的傳遞,服從SPC-4。下面重點說一說Connect和Property Get/ Set。

在NVMe over Fabrics協議中,約定每個發送隊列都與一個接收隊列對應,不允許多個發送隊列使用同一個接收隊列。發送接收隊列對是通過Connect命令來創建的。Connect命令攜帶有Host NQN,NVM Subsystem NQN和Host Identifier信息,並且可以指定連接到一個靜態的控制器,或者連接到一個動態的控制器。

一個主機可以通過不同的Host NQN或不同的Fabric Port建立到一個NVM Subsystem的多重連接。這種靈活性賦予了NVMe over Fabrics極大的靈活性。按照協議規定,同一個控制器的所有發送接收隊列對既可以共享底層的互聯通道,也可以分別獨佔一格底層互聯通道,方便根據傳輸層的特點來進行靈活的選擇。

在NVMe協議中,控制器是一個代表與主機進行溝通的介面實體。由於PCIe協議是一種樹狀拓撲結構,因此一旦控制器所處的PCIe Port定下來後,介面所關聯的控制器就完全定下來了。而對於NVMe over Fabrics協議來說,一個Fabric的Port可以嵌入多個控制器,因此根據需要不同,可以選擇實現靜態控制器或動態控制器。

動態控制器是一種簡單的模型,適用於對主機具有相同的服務特性的需求。靜態控制器則適用於有不同需要的場景,Initiator可以查詢了解一個Fabric Port內部包含的靜態控制器各自的能力,然後選擇連接到指定的控制器以滿足自身的需要。

在經典的NVMe協議中,PCIe空間的BAR0(BAR1)描述了一段內存空間用於對控制器進行基本的寄存器級別的配置。由於Fabrics結構沒有等效的實現,因此NVMe over Fabrics協議定義了Property Get/ Set分別表示對於控制器端的寄存器讀取和寫入動作。

至此,NVMe的標準操作就完全被準確和高效地映射成互聯網路所對應的使用方式了。為了能滿足互聯網路的發現機制,NVMe over Fabrics協議定義了發現服務,用於讓Initiator主動發現NVM Subsystem和對應的可訪問的名字空間。這個服務還同時用於支持多路徑功能。該功能依賴於一個特殊的配置成支持發現服務的NVMe Subsystem。Initiator可以連接到該伺服器並使用Discovery Log Page命令來獲取可用的資源。

與NVMe over Fabrics協議一同發布的,還有一份在Linux平台上實現的基於RDMA和FC傳輸層的NVMe協議的Initiator和Target端的參考代碼。這份代碼不僅僅包含了協議的驅動實現,也包含了對應的CLI工具和Linux OS集成支持。相信對整個生態圈來說這會是一個良好的開端。

溫馨提示:

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 架構師技術聯盟 的精彩文章:

基礎知識:你真的了解雲計算嗎?

TAG:架構師技術聯盟 |