1. 程式人生 > >NVMe技術架構深度分析

NVMe技術架構深度分析

640?wx_fmt=jpeg

640?wx_fmt=gif&wxfrom=5&wx_lazy=1

NVM(Non-Volatile Memory)翻譯過來為非易失儲存器,是一類儲存器的一般術語總稱。而NVMe(Non-Volatile Memory Express)是一個可擴充套件的主控器晶片介面標準,主要為企業、資料中心以及客戶端系統中應用PCIe介面的固態儲存裝置(SSD)設計,它的目標是最大限度的釋放快閃記憶體的潛能。

NVMe介面屬於邏輯裝置介面,工作在支援NVMe的板卡上的主控器和主機端的對等層內,它規定了作業系統與NVM子系統之間的通訊協議,定義了一套指令集和功能集。NVMe為基於PCIe的SSD帶來了較低的時延,較高的IOPS和較低能耗的優勢。

首先通過下圖展示下NVMe在資料傳輸過程中的位置,有一部分位於PCIe之上,這部分也是NVMe驅動的主要部分,還有一部分位於使用者態的軟體層,用於應用層與NVMe驅動間的互動。

640?wx_fmt=png

NVMe有以下幾個關鍵屬性:

  • 在命令提交(Command Submission)或者完成(Completion)的路徑上不需要讀取相關暫存器(不可快取或MMIO暫存器);

  • 支援最多可達64K 的I/O 佇列,每個佇列支援64K的未處理命令命令;

  • 每個佇列的的優先順序擁有明確的仲裁機制;

  • 為確保超高效的IO操作,完成一個4KB讀取請求需要的所有資訊包含在64B的命令中;

  • 高效且流線型的指令集;

  • 支援MSI/MSI-X中斷和中斷聚合;

  • 支援多個名稱空間;

  • 有效支援IO虛擬化架構,如SR-IOV;

  • 健全的錯誤報告和管理功能;

  • 支援多路徑IO和名稱空間共享;

  • 支援許多企業需求,如端到端的資料保護(與SCSI保護資訊相容)。

NVMe有很多關鍵概念,其中名稱空間(Name Space簡稱NS),是一定量的NVM(Non-Volatile Memory)集合,這些NVM可被格式化為許多個邏輯塊。一個NVMe控制器能支援多個由不同名稱空間ID(簡稱NSID)標識的NS。

在系統向某個NS提交IO命令之前,這個NS必須與某個控制器關聯。若NVM子系統支援NS管理,則NVM子系統內的NSID必須是唯一的(不管NS連線的是哪個控制器);若不支援,則不要求私有NS的ID唯一。NVM子系統包括N個控制器,M個名稱空間,S個PCIe埠,一個NVM介質以及一個介面連線控制器與該介質。

NVMe是基於成對的Submission Queue(簡稱SQ)和Completion Queue(簡稱CQ)機制工作,它們存在於主機記憶體裡。Submission Queue由系統放置命令,Completion Queue由控制器放置完成資訊。

Admin Submission Queue和對應的Admin Completion Queue用來管理和控制主控器(如建立和刪除IO佇列,終止命令等),只有屬於AdminCommand Set的命令才會被提交到AdminSubmission Queue。Admin Queue的ID都是0。

IO Submission Queues和對應的IOCompletion Queues用來處理IO命令,規範定義了一種IO Command Set,叫做NVM Command Set,與IO佇列一起使用。系統在建立Submission Queue前必須先建立相關的Completion Queue,刪除操作也要先於相關的Completion Queue。

下面兩張圖展示了主機、主控器與佇列之間的配合關係。由系統建立佇列,佇列最大數目可到主控器支援的上限。通常情況下是根據主機的配置和預期的工作負載來建立,並將一對佇列繫結到一個CPU核上,避免使用鎖與更多的核間資料傳遞。從下面兩張圖中可以看出Admin永遠是1對1的,而IO佇列可以是多個SQ對應一個CQ。

640?wx_fmt=png

每個SQ都是一個有著固定“槽位”大小的迴圈緩衝區,系統用它來提交命令來等待控制器執行。當系統提交了一批新的等待執行的命令時,系統將更新SQ尾部Doorbell暫存器通知主控器,這時主控器將重寫主控器內部對應SQ尾部的值。主控器從SQ中順序取出64位元組的命令,但之後對命令的執行可能是任何順序。

記憶體中將分配PRP(Physical Region Page)條目或Scatter Gather Lists(SGL)用於資料傳輸,每個命令包括兩個PRP條目或一個SGL部分。如果需要更多的PRP條目則需要提供一個指向PRP連結串列的指標,而對於SGL則在SGL部分提供一個指向下一個SGL部分的指標。

每個CQ也都是一個有著固定“槽位”大小的迴圈緩衝區,控制器用它來投遞已完成命令的狀態資訊。一個已完成的命令由相關的SQ ID和CQ ID唯一標識,SQ和CQ的ID由系統分配。系統在處理好CQ條目後會釋放該CQ條目並更新CQ的頭指標。

在CQ條目中,有一Bit(Phase簡稱P)是用來表示該條目是否是剛剛投遞來的,這樣做可以幫助系統決定該新條目是前一輪還是當前一輪的完成通知。每次處理CQ時,遍歷完所有CQE條目後,控制器都會將Phase值取反。

多路徑IO指的是一個主機和一個名稱空間之間存在多條完全獨立的PCIe路徑。名稱空間共享指的是多個主機可以通過不同的NVMe控制器接入同一個名稱空間,要求NVM子系統包含多個控制器。

下圖(1)是沒有多路徑IO和名稱空間共享的情況,NVMe控制器下的NSID互不相同。圖(2)是有名稱空間共享沒有多路徑IO的情況,兩個控制器用一個PCIe埠(一個為Func0一個為Func1),共享一個名稱空間(在控制器內必須用相同的ID)。當共享名稱空間的控制器存在併發訪問該名稱空間時,應設定控制器支援原子操作,並可採用不同的優先順序。

640?wx_fmt=png

640?wx_fmt=png

圖2-3(3)是有多路徑IO和名稱空間共享的情況,這樣的情境中,兩個PCIe埠是完全獨立的。

NVMe對SR-IOV的支援示意圖(不一定只有一個PCIe埠)如下。圖中可看出NVM子系統只有一個物理Func0,其餘4個均為虛擬Func(0, x)。

640?wx_fmt=png

每個虛擬Func都有一個與之關聯的NVMe控制器,且每個控制器有一個私有的名稱空間和同一個共享的名稱空間。通過這樣的方法,實現了PCIe的擴充套件,允許上層執行的虛擬機器能夠高效的共享PCIe的硬體資源。

硬體形態上,和傳統SCSI盤比較,NVMe子系統直接通過PCIe匯流排和主機連線,路徑中不再需要HBA卡,降低了系統開銷。

640?wx_fmt=png

NVMe子系統內部組成:

  • 至少一個PCIe port,用於外部連線

  • 至少一個NVMe controller,該controller是實現了NVMe邏輯的PCI   function

  • 名字空間標識(NSID)即LUN號

  • 名字空間(NS)即LBA

  • NAND Flash介質 (上圖未標出)

NVMe和傳統SCSI體系比較,在主機側,NVMe子系統減少了IO排程層,單獨的命令層,IO路徑更短,為低延遲提供了保障。

640?wx_fmt=png

NVMe儲存裝置涉及的主機側軟體棧包括: NVMe驅動,虛擬塊管理層,檔案系統層。NVMe規範重新設計定義了I/O佇列機制及相應的仲裁機制,較傳統的SCSI體系軟體棧減少了實現排隊功能的通用IO的排程層。NVMe驅動同時實現了底層傳輸和裝置操作命令,較傳統SCSI體系減少了單獨的命令層。

本文分享就到這裡了,請通過原文連結獲取電子書材料,或者請識別小程式檢視更多內容。

640?wx_fmt=jpeg

推薦閱讀:

溫馨提示:

請搜尋“ICT_Architect”“掃一掃”二維碼關注公眾號,點選原文連結獲取更多技術電子書

640?wx_fmt=png&wxfrom=5&wx_lazy=1

求知若渴, 虛心若愚

640?wx_fmt=gif&wxfrom=5&wx_lazy=1