NVMe over Fabrics:概念、應用和實現


對於大部分人來說,NVMe over Fabrics(簡稱NVMf)還是個新東西,因為其第一個正式版本的協議在今年6月份才發布。但是這並不影響人們對NVMf的關注,因為這項依托於NVMe的技術很可能繼續改變存儲市場格局。

NVMf的貢獻在於提供除PCIe外訪問NVM的另一個途徑-Fabrics,並且將fabrics鏈路在latency上增加的overhead維持在10us以內。來自NVMf spec的一張圖清晰的展示了它的野心,圍繞着NVMe的戰場再一次擴大了。

提供fabrics途徑后,可以在其他節點直接訪問NVMe設備,那么最基本的應用就是替代傳統的iSCSI,在閃存系統中導出NVMe。

 

NVMf以NVMe為基石,適配Fabrics場景,新增或刪減了的一些Command、概念。

1,Host,Target和Transport

client端稱作Host,處理client請求的部分稱作Target端(連接物理NVMe設備),Host和Target之間使用NVMe命令交流。Transport是連接Host和Target的橋梁,可以是RDMA或者FC。在Fabrics傳輸過程中,NVMe命令會被相應的Transport代碼封裝(Capsule)和解析。

2,NVMe Subsystem,NVMe Namespace和Port

一個Subsystem就是一個NVMe子系統,Subsystem在target端,Host可以申請連接某個target的Subsystem。一個Port代表一個Transport資源。Subsystem必須和Namespace,Port建立關系,但是他們的聯系又是很靈活的:即一個Subsystem可以包含多個Namespace,一個Namespace可以加入多個Subsystem,一個Port可以放入多個Subsystem。如下可以將一個NVMe Namespace放入兩個Subsystem中形成Fabric多路徑配置。

3,NVMe Subsystem中的NVMe Controller

在NVMe Subsystem中,NVMe Controller是一個虛擬的概念,但是具有NVMe協議規定的屬性(如部分NVMe寄存器,NVMe Queue和處理NVMe Command)。當一個host接入Subsystem后,就會創建一個Controller對象。那么如何處理NVMe寄存器的訪問呢?這就要涉及到NVMf定義的幾個Command。

4,NVMf新增和刪減Command

在NVMf下,Host和Target之間的傳輸舍棄了Doorbell的設計,刪除了NVMe Queue Create等Admin Command。NVMe Queue的創建在構建Controller后就已經完成了。

NVMf協議新增加的Command如下圖,其中Property用來訪問NVMe Controller寄存器(僅限於有限的幾個寄存器,如Controller Configuration),Connect用來連接Host與Controller的NVMe Queue,Authentication則用於權限管理。

5,NVMe Command的傳輸方式

Host和Target間的NVMe命令可以在Transport封裝時將I/O 數據置於NVMe Command(64Bytes)之后,或者使用SGL表示。如果是前者,則target直接從offset處讀取數據,如果是后者,則需要通過RDMA read獲取數據(Transport為RDMA的情況下)。雖然聲稱使用SGL,但是無論是SPDK還是Kernel 實現的Target在提交給物理設備的時候都會轉換成PRP,所以目前的NVMe SSD還無需擔心由於無法處理SGL請求導致的問題。

NVMf的推廣很大程度上要依賴於其代碼的實現,好在從Linux Kernel 4.8開始就被收納,目前只有RDMA一種Fabric Transport。接下來我們看看內核態NVMf的代碼框架。

Host端,主要是Host端代碼和非NVMf模式下Local NVMe的處理。不管是Host端,還是Local的請求都會經過Linux blk-mq再下發到物理NVMe設備。當然,在經過Fabrics前,I/O請求會先被封裝成NVMe Command格式。

Target端,實現了兩種Transport(Loopback和RDMA),用戶設置通過configfs進行。在收到Host端的I/O請求后,Target也是經過blk-mq下發到物理設備(其實是通過submit_bio向Host端的Local NVMe代碼發起請求,類似於文件系統的方式)。

SPDK也加入了NVMf陣營,實現了Target端的代碼。由於SPDK天然的優勢,Target端的I/O請求可以直接發給物理Controller(Direct模式下),並且按照NVMf的規定將物理Controller作為NVMf獨占,在I/O路徑和框架上看起來更簡潔。

不過,值得一提的是,無論是SPDK還是內核NVMf,從Host端過來的NVMe Command都要被Target代碼解析成普通的I/O Request發給PCIe NVMe代碼處理,所以NVMf下無論是NVMe Queue還是NVMe Command都是相對於Subsystem和host之間而言。

 

說明

本文最先發布於公眾號《存儲技術最前線》,歡迎關注獲取最新NVMe技術和資訊

 

參考資料

1, NVM Express over Fabrics Revision 1.0 spec

2, NVM Express Over Fabrics by Dave Minturn,Intel undle Openfabrics Alliance

3, Under the Hood with NVMe over Fabrics by Dave Minturn,Intel at SNIA forum

4, NVM Express Device Drivers by Uma M.Parepalli at FlashMemroy Summit

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM