理解NVMe的內部實現(xiàn)原理颤霎,這一篇就夠了
任何新技術的出現(xiàn)都是為了解決當前情況存在的問題呼股。NVMe的出現(xiàn)也是為了解決當前存在的問題溉卓。這個問題就是日益快速增長的存儲介質性能與傳輸通道性能太差之間的矛盾懂从。基于SSD的存儲設備性能都要上天了艰垂,但SAS和SATA接口的性能卻沒有本質的提升。
目前基于SCSI協(xié)議的SAS和SATA只能是單個隊列而且每個隊列的深度也比較低埋虹,分別是254和32的隊列深度猜憎。而NVMe協(xié)議設計之初就考慮了該問題,它的最大隊列數(shù)量可以是64K(65535個命令隊列和1個管理隊列)搔课,而每個隊列的深度可以高達64K胰柑。與SCSI協(xié)議相比,就好比一個鄉(xiāng)村的羊腸小路和一個雙向八車道的高速公路的差別爬泥。
圖1 美麗的鄉(xiāng)村下路和京港澳高速
NVMe基本原理
為了便于理解主機和NVMe設備的關系柬讨,我們這里簡化NVMe設備的內部結構。如圖2所示為NVMe白皮書中的配圖袍啡,這里主機稱為Host踩官,而NVMe設備稱為Controller(控制器)。主機和控制器之間通過共享內存的隊列實現(xiàn)交互境输。
圖2 NVMe多隊列示意圖
NVMe的隊列分為2種卖鲤,其中一種是用于管理的隊列,稱為Admin Queue(管理隊列)畴嘶,僅有一個,另外一種是命令隊列(Command Queue)集晚,最多可以有65535個窗悯。其中命令隊列的數(shù)量和模式都是通過管理隊列來設置的。其中每一個隊列實際上是一個隊列對偷拔,也就是包括兩個隊列蒋院,分別是提交隊列(Submission Queue)和完成隊列(Completion Queue)。提交隊列用于主機端向NVMe設備發(fā)送NVMe命令莲绰,而完成隊列則用于NVMe設備向主機反饋命令執(zhí)行情況欺旧。實際上NVMe還有另外一種模式,就是多個提交隊列共享同一個完成隊列的情況蛤签,本文暫時不做介紹辞友。
NVMe隊列及命令的處理流程
上文我們知道NVMe是通過隊列傳遞控制命令和命令等內容的,那么這里的隊列實體到底是什么呢震肮?其實這里提交隊列和完成隊列就是內存的一個區(qū)域称龙。在數(shù)據(jù)結構原理上這里的隊列其實是一個環(huán)形緩沖區(qū),如圖3所示戳晌。
圖3 環(huán)形緩沖區(qū)
NVMe通過一種門鈴機制(Doorbell)來告知控制器命令隊列是否有新數(shù)請求/命令鲫尊。也就是說每個隊列都有一個門鈴指針。對于發(fā)送隊列來說沦偎,這個指針表示的是發(fā)送隊列的尾指針疫向。主機端將數(shù)據(jù)寫入到發(fā)送隊列后咳蔚,更新映射到位于設備寄存器空間中的門鈴的尾指針。此時搔驼,在控制器端就知道有新的請求/命令到來谈火,接下來就可以進行對其進行處理。
當控制器完成一個NVMe請求時匙奴,通過完成隊列來把完成的結果告知主機端堆巧。與發(fā)送隊列不同,完成隊列是通過中斷機制(可以是INTx泼菌,MSI或MSIx)告訴主機端谍肤。如圖4是一個命令的完整處理流程。
圖4 命令處理完整流程
NVMe的命令格式
前面我們介紹了命令的發(fā)送和處理流程哗伯,接下來我們看看NVMe的命令長什么樣荒揣。如圖5是NMVe命令的具體格式,如果大家了解TCP/IP協(xié)議或者SCSI協(xié)議焊刹,那么理解本圖將相當容易系任。在圖4中每一行為8個字節(jié),命令大小總共為64字節(jié)虐块。
圖5 NVMe的命令格式
在這個命令格式中有幾個字段本身是比較復雜的俩滥,限于篇幅,且不打算讓大家看完本文后頭疼贺奠,本文不打算介紹所有細節(jié)霜旧。本文簡單的介紹一下該命令格式的幾個關鍵字段。其中Command Identifier標識一個具體的命令儡率。Namespace Identifier則表示命令發(fā)送到那個命名空間挂据。Data Pointer 1 和Data Pointer 2則用于標識數(shù)據(jù)的具體位置。
這里有兩點需要說明:
NVMe的一個控制器下面可以有多個命名空間(Namespace)儿普,通過Namespace ID來標識的崎逃。
命令與數(shù)據(jù)是分離的,并不像TCP那樣數(shù)據(jù)在命令后面眉孩。
我們這里重點介紹一下Command Identifier个绍,該字段占用4個字節(jié)的空間。雖然僅有4個字節(jié)浪汪,但有分為3大部分障贸,6小部分,具體如圖6所示吟宦。
圖6 命令標識格式
我們以從低位到高位的順序分別介紹一下各個字段的含義:
OPC: 全稱為Opcode篮洁,也就是被執(zhí)行命令的操作碼。具體來說就是想讓控制器干什么殃姓,比如讀數(shù)據(jù)袁波、寫數(shù)據(jù)或者刷寫等瓦阐。
圖7 OPC定義
FUSE: 全稱為Fused Operation, 用于標識該命令是普通命令還是復合命令篷牌。如圖8是白皮書對該字段的說明睡蟋。
圖8 FUSE的定義
PSDT: 全稱為PRP or SGL for Data Transfer,這個用于說明存儲數(shù)據(jù)的內存的組織形式枷颊。
NVMe的性能
最后我們看一下NVMe與SAS和SATA存儲設備的性能對比戳杀。為了避免廣告嫌疑,本文就布局圖說明設備的廠商和類型了夭苗。
圖9 性能對比
通過上圖可以清楚的看到SAS和SATA設備與NVMe設備的性能差異信卡,特別是對于讀操作,NVMe有絕對的性能優(yōu)勢题造。