它分為兩部分,這里是第一部分。
NVM Express(NVMe)是一種高性能、可擴展的接口協議,用于通過PCI express(PCIe)總線,實現主機軟件與NVM設備之間的通信。目前,由于NVMe SSD相比于SATA SSD具有更高的吞吐量、更快的訪問速度和更低的功耗,已經被廣泛應用于各種計算領域和存儲系統。
NVMe隊列
NVMe協議采用成對的提交隊列(Submission Queue,SQ)和完成隊列(Completion Queue,CQ)機制。SQ用于存放提交命令,而CQ則用于存放完成信息。隊列狀態信息通過門鈴寄存器(Door Bell,DB)來檢測。這兩個隊列采用了環形隊列結構,隊列可以映射到任何PCIe可訪問的內存中,通常放在主機側內存。對于提交隊列,主機端是生產者,NVMe SSD是消費者。完成隊列的情況剛好相反。因此SQ Tail指針和CQ Head指針由主機更新,而其他兩個指針由NVMe控制器更新。NVMe的隊列結構如圖1所示。
圖1 隊列示意圖
NVMe隊列的深度是固定的,通過Tail和Head來分別指向隊列的首尾位置,隊列實際可用的大小是隊列大小減1,當Head條目指針等于Tail條目指針時,隊列為空。當Head條目指針比Tail條目指針多一個時,隊列為滿。
NVMe協議中根據命令類型將隊列分為了Admin隊列和I/O隊列,Admin隊列用來緩存管理Admin命令,如獲取SSD屬性、創建I/O隊列等。而I/O隊列用來緩存管理I/O命令,如讀、寫、識別等。在一個系統中只能有一對Admin SQ/CQ,但可以存在多對IO SQ/CQ。Admin SQ/CQ僅用來進行Admin命令的交互,I/O SQ/CQ僅用來進行I/O命令的交互。對于多核系統來說,每個核內雖然只有1個I/O CQ,但是可以存在多個I/O SQ,如圖2所示。
圖2 NVME 多隊列示意圖
由于Host端可能存在多個流水線,多隊列的設計可以讓系統的性能最大化。同時,可以通過對不同的隊列設置不同的優先級,來保證高優先級隊列的命令更快完成。NVMe協議中規定Admin SQ/CQ的隊列深度最大可以支持4096(4K),I/O SQ/CQ的隊列深度最大可以支持65536(64K)。在一個實際設計中,SQ的個數和深度的設置可以根據項目需求和硬件資源進行配置。隊列深度的設置主要和系統中隊列消費者和生產者之間的速率有關。
NVMe分層結構
NVMe協議棧結構分為應用層和傳輸層兩個層次。在應用層中實現NVMe命令生成、隊列管理和流程控制,而傳輸層則借助PCIe協議進行實現。PCIe協議分為三層,即事務層、數據鏈路層和物理層。事務層負責將數據傳輸請求和響應打包成事務進行傳輸,數據鏈路層則負責數據傳輸的可靠性和流控制,通過鏈路層控制器(Link Layer Controller, LLC)實現。物理層則負責物理傳輸,包括電信號的發射和接收、時序控制和線路管理等。其分層結構圖如圖3所示。首先,在應用層生成NVMe命令傳輸至事務層。其次,在事務層會對上層傳輸的數據添加首部和校驗,封裝成TLP(Transaction Level Packet)傳輸至數據鏈路層。然后,在數據鏈路層會對TLP添加序列號和校驗,封裝成DLLP。最后,在物理層對數據包進行編碼和并轉串處理后,通過SerDes(Serializer/Deserializer)將數據發送至PCIe鏈路中。
圖3 NVMe 分層結構示意圖
由于NVMe協議是基于PCIe協議實現的,下面通過在PCIe拓撲結構中介紹NVMe協議中的SQ、CQ和DB的位置,以及數據在Host和NVMe SSD之間的傳輸流程。NVMe SSD在PCIe拓撲結構中的位置如圖4所示。
圖4 PCIe拓撲結構圖
PCIe的拓撲結構由三部分組成,根聯合體(Root Complex, RC)、PCIe交換器(PCIe Switch)和端點(Endpoint, EP)。根聯合體位于拓撲結構的根部,最靠近CPU。端點設備位于PCIe的端末。交換機位于根聯合體和端點設備之間。PCIe使用串行鏈路連接,一個鏈路的兩端只能有兩個設備。因此PCIe需要通過PCIe Switch擴展PCIe鏈路后,才能連接多個EP設備。在NVMe存儲結構中,NVMe SSD也作為PCIe的一個EP端掛載在RC上。
NVMe協議中的SQ和CQ位于Host內存中,主機在初始化時根據隊列的個數和深度在主機內存開辟出相應的內存空間,來存放SQ、CQ命令。DB寄存器位于NVMe SSD中,且被映射到BAR(Base Address Register)空間中,Host可以通過訪問BAR空間來更新DB寄存器的值。
當Host需要向NVMe SSD發送命令時,首先將命令存放在主機內存開辟的SQ區域中,其次通過訪問BAR空間的DB寄存器來告訴NVMe SSD到主機端內存區域取走待執行的命令。待命令執行完成后,NVMe SSD向主機內存的CQ區域寫入完成命令。