張平
NVMe作為SSD的最主要傳輸標準,在各個方面都針對NAND顆粒的特性做出了優(yōu)化。不過隨著NAND適用范圍變大以及應用程度加強,人們發(fā)現(xiàn)NVMe還存在很多可以加強、補足的地方。因此,新的NVMe 1.4規(guī)范順應而出,帶來了大量的全新特性,尤其糾錯、性能加強以及為特殊領域和企業(yè)級的優(yōu)化更是令人關注。今天,本文就解讀一下NVMe 1.4的新特性。
說起來,NVMe的上一次重大更新還是在大約2年以前。在這段時間中,NVMe發(fā)布了新的SSD NVMe規(guī)范。不僅如此,NVMe組織還采用了不同的方法為NVMe規(guī)范添加新功能,比如將已經(jīng)準備好的新功能單獨批準,并作為技術提案發(fā)布,而不是捆綁在全新的主要更新規(guī)格中一次性發(fā)布。這樣漸次發(fā)布的做法可以使得供應商在技術成熟后,馬上便可以開始實施和部署這些新的功能,而不是針對草案進行操作。
這樣的情況也出現(xiàn)在今天的NVMe 1.4中。NVMe 1.4版本包含了NVMe 1.3版本之后發(fā)布的所有28個新的技術提案,以及從1.3a版本開始,一直到1.3d版本中加入的各種修正以及說明。總的來說,NVMe 1.4相比NVMe 1.3,是一個更大的更新,因為其規(guī)范內(nèi)容更多并且加入了對功能更深入的解釋。這樣一來,雖然NVMe 1.4規(guī)范的頁碼就大幅度增加到403頁(上一代NVMe 1.3d版本只有298頁),但是易讀性和可操作性更好了。
和之前版本類似的是,NVMe 1.4中加入的新功能和NVMe sSD的使用并非完全相關,部分內(nèi)容只跟嵌入式系統(tǒng)或者超大規(guī)模部署的客戶有關,因此大量的功能都不是必備的,而是可選的。相關的配套標準,比如NVMe管理界面和NVMe over Fabrics,都在不斷地改進、發(fā)展,比如NVMe-MI的1.1版本在2018年12月獲得了批準,NVMe over TCP已經(jīng)成為NVMeof的第三個傳輸協(xié)議,并且加入了光纖通道和RDMA傳輸。而最基本的NVMe規(guī)范中的附加功能,往往被用于適應這些配套標準的變化。
新的可選功能需要操作系統(tǒng)中的SSD和NVMe驅動進行支持,如果沒有驅動和技術的同時支持,驅動器將會退回到比較舊的功能級。為了更有效地使用新功能,還需要對蜘牛堆棧的上層進行一些修改,尤其是許多存儲管理工具會通過了解SSD的參數(shù)和信息來提供對應的功能。這些軟件更新的開發(fā)時間要比相關SSD固件的開發(fā)時間更長一些,因此對這些新特性的支持將在專用的環(huán)境中出現(xiàn),并且早于通用的操作系統(tǒng)發(fā)布之前。
目前來看,NVMe SSD市場正處于從PCIe 3.0向PCIe 4.0過渡,同時實現(xiàn)性能改進的早期階段。在這個階段中,還不太需要對NVMe規(guī)范進行任何根本性的更改。但隨著技術演進和更多應用的出現(xiàn),NVMe還需要進一步加強它在性能方面的優(yōu)勢。有鑒于此,NVMe 1.4版本包含了一些性能方面的優(yōu)化,這些優(yōu)化依賴于更智能地了解存儲的使用方式,以及SSD和王機系統(tǒng)之間更好的協(xié)作。另一大類則與功能、錯誤處理,以及RAID重建等有關系。本文將介紹這些新規(guī)范中值得關注的內(nèi)容,但并不是所有內(nèi)容的詳細列表。需要聲明的是,本文中給出的用例可能和最終硬件供應商的實際產(chǎn)品不符,畢竟目前規(guī)范剛推出,依舊還有很大的操作空間。
更多的塊大小和對齊提示
NVMe的行為類似于常規(guī)塊設備,扇區(qū)大小通常是512字節(jié)或者4KB。現(xiàn)代NAND的原始頁面大小大于4KB,擦除塊大小的單位更是MB。這種不匹配情況是SSD閃存數(shù)據(jù)轉換層中絕大多數(shù)復雜處理和性能壓力的來源。FTL允許軟件在假設它們的存儲塊具有較小大小的情況下正常工作,但對如果能夠對實際的塊大小和頁面大小更為匹配的話將會簡化SSD的工作并且支持更高的性能。NVMe1.3規(guī)范引入了名稱空間最優(yōu)化IO邊界的特性,允許SSD向主機系統(tǒng)通知讀取和寫入命令,最基本的要求是讓其實現(xiàn)最佳性能。目前在這個特性支持下,已經(jīng)有允許更小尺寸的塊訪問驅動器的情況,但是對于小于4KB的數(shù)據(jù),傳輸性能非常差。
即便是在最糟糕的情形下,驅動器應該只是放棄對512B扇區(qū)的支持,轉而采用默認的4KB扇區(qū),但是在需要和舊操作系統(tǒng)兼容的情況下,關于哪些訪問模式可以兼容性工作的提示可能會對實際的操作有所幫助。NVMe 1.4版本下的SSD能夠和系統(tǒng)通訊并獲得更詳細的信息,使得諸如寫和存儲單元重分配(TRIM)等命令能夠匹配相關頁面的大小和擦除塊的大小。
在NVMe 1.4版本下,驅動器可以報告命名空間首選寫入對齊和命名空間首選的寫入粒度,這些值只對NAND頁面的一部分應用最小化的“讀取——修改——寫入”周期。同樣的,命名空間首選的存儲單元重分配對齊和命名空間首選的存儲單元重分配粒度也適用于NVME的存儲單元重分配命令,這個命令與ATA TRIM命令類似。對SSD來說,如果不增加寫入放大,就很難處理覆蓋小數(shù)據(jù)范圍或大數(shù)據(jù)范圍但沒有對齊部分的存儲單元重分配命令,否則這將會損害性能并增加寫入放大。支持NVMe 1.4的Streams功能的驅動器還可以在使用Streams功能時,提供首選寫入和取消分配粒度的提示,這些值通常是上述提示的倍數(shù)。
充分利用這些信息的責任現(xiàn)在將會落在操作系統(tǒng)和文件系統(tǒng)上,可以根據(jù)此信息設置RAID的條帶大小和文件系統(tǒng)塊的大小。對數(shù)據(jù)庫之類的應用也需要注意到這一點,因為這類應用往往會試圖繞過操作系統(tǒng)的大部分存儲堆棧,然后自主優(yōu)化存儲性能,這一點在NVMe 1.4部署后需要進行調整。
更快度的錯誤檢測和數(shù)據(jù)恢復機制
NVMe 1.4引入了一些新的功能來幫助處理不可恢復的讀取錯誤和損壞的數(shù)據(jù),尤其是在RAID和類似場景中,這項技術使得主機系統(tǒng)可以簡單地從其他地方獲取數(shù)據(jù)來更快地恢復損失的數(shù)據(jù)。
第一個技術被稱為讀取恢復級別判定,也就是Read Recovery Level。這項功能可以允許王機系統(tǒng)自行配置SSD恢復損壞區(qū)域數(shù)據(jù)的難度級別。我們知道SSD通常有多個錯誤校正層,一般來說上層比下層在數(shù)據(jù)恢復方面更為可靠,但是上層的速度會相應更慢且耗電量更高。在RAID 1或者類似場景中,主機系統(tǒng)通常傾向于快速獲取錯誤,這樣它既可以嘗試從鏡像的另一端讀取相同的數(shù)據(jù),也不用等待驅動器部分進行數(shù)據(jù)重讀的嘗試,然后再返回ECC校驗這樣較慢的方法。目前NVMe已經(jīng)可以支持有時間限制的錯誤恢復,也就是TLER,這項技術只允許主機將錯誤處理時間限制在100ms以內(nèi)。相比之下,讀取恢復級別判定技術可以允許驅動器保存16個不同級別的錯誤的處理策略,只需要驅動器擁有2種不同的工作模式即可。這個功能將在每個NVM集的級別上進行配置。
接下來的技術是為了主動避免不可恢復的讀取錯誤。NVMe 1.4加入了驗證和獲取LBA狀態(tài)(Get LBAstatus)兩個命令。其中驗證命令比較簡單,這個命令除了將數(shù)據(jù)返回給王機系統(tǒng)之外,它還可以執(zhí)行正常讀取所需要的一切操作。如果讀取命令返回錯誤,那么驗證命令也將返回;如果讀取命令成功完成,那么驗證命令也會成功完成。這個命令的優(yōu)勢在于,其可以在不受王機接口帶寬瓶頸的影響下,對存儲的數(shù)據(jù)進行底層清理成為可能。一些SSD將通過移動或者重寫降級的數(shù)據(jù)來響應可修復的ECC錯誤,驗證命令也可以完成相同的行為??偟膩碚f,驗證命令將減少對文件系統(tǒng)級別校驗和清除/驗證的需求。另外,在驗證命令執(zhí)行的過程中,每個執(zhí)行位置都會加入一個位標記,這個標記將指示SSD是應該恢復快速失敗還是應該努力恢復數(shù)據(jù),位標記的功能和讀取恢復級別判定功能有很相似。
獲取LBA狀態(tài)命令允許驅動器向主機提供一個區(qū)塊列表。在這個區(qū)塊列表中,它包含的內(nèi)容是那些嘗試讀取或者驗證命令后可能導致不可恢復的讀取錯誤的塊。S5D可能已經(jīng)在自動后臺掃描中檢測到了ECC錯誤,或者在更嚴重的情況下,這個功能可以報告有哪些LBA受到了整個NAND通道的故障影響,從而可以避開這些區(qū)域。獲取LBA狀態(tài)命令還可以用于要求在返回可能不可恢復的區(qū)塊列表之前,就預先掃描選定的數(shù)據(jù)范圍。另外,當主機系統(tǒng)發(fā)現(xiàn)損壞或者數(shù)據(jù)丟失的LBA狀態(tài)特性時,或者發(fā)出讀取、驗證命令后收到錯誤,發(fā)現(xiàn)數(shù)據(jù)丟失時,這個命令還可以將其他地方的數(shù)據(jù)副本(比文DRAID或者備份數(shù)據(jù))重新寫入到相同的LBA中,然后正常使用這些邏輯塊。SSD將在必要的時候徹底封閉受損的物理塊避免再次丟失數(shù)據(jù)。
持續(xù)存儲區(qū)域
大多數(shù)NVMe SSD,除了NAND以外,還加入了DRAM顆粒。這些DRAM顆粒的主要目的之一是作為Flash翻譯層表的緩存,這些表用于跟蹤邏輯塊的地址和物理閃存地址之間的映射。但是NVMe一直在探索使用DRAM或者其他更陜的方式去完成這個操作。在NVMe 1.2規(guī)范中,它引入了控制器內(nèi)存緩沖區(qū),這使得SSD的一些DRAM可以通過PCI地址空間直接訪問。這個設計允許IO命令提交和完成的隊列在SSD的內(nèi)存而不是主機的CPU內(nèi)存中存放,這將減少提交方的延遲,并目可以在NVMe over Fabrics的情況下切斷一些不必要的復制,甚至諸如DMA之間SSD和網(wǎng)卡的數(shù)據(jù)交換允許完全繞過主機DRAM等。
在NVMe 1.4規(guī)范中,新的PMR也就是持續(xù)存儲區(qū)域(PersistentMemory Region)功能以類似的方式運行,它可以直接接受外界數(shù)據(jù)的讀寫請求。主機系統(tǒng)可以使用基本的PCIe傳輸直接讀取或者寫入PMR,無需任何命令隊列的開銷。當然,控制器內(nèi)存緩沖區(qū)通常用于支持正常的NVMe操作,PMR這不會參與其中。但值得注意的是,由于PMR是一個通用的內(nèi)存塊,具有電源損耗保護電容器,它可以在主機電源意外斷電的情況下,安全地刷新企業(yè)級S5D的內(nèi)部緩存,此時PHR內(nèi)的內(nèi)容將自動寫入閃存,并且在主機恢復時,可以要求SSD重新加載PMR中的內(nèi)容。
PMR的性能和容量不會接近NVDIMM所能提供的數(shù)據(jù),但是PMR可以提供一些類似的優(yōu)勢。比如訪問PMR比構建NVMe IO命令并等待完成的速度要快很多,而且實現(xiàn)起來更為簡單。PMR功能還能夠接受非常大量的寫入數(shù)據(jù),同時它不會耗盡任何閃存,因此其內(nèi)容只有在電源發(fā)生故障的時候才會保存到閃存中,這使得PMR成為存儲數(shù)據(jù)庫或者文件系統(tǒng)日志最好的地方,因為這些文件會不斷地寫入更新,并且非常容易成為性能瓶頸。
NVM集和耐久陸組
NVM集和耐久性組是兩種新的高級組織結構,用于管理大于單個NVMe名稱空間的存儲池。由于高端企業(yè)級SSD對多個命名空間技術的需要,因此依賴于NVM集或者耐久性組的某些功能僅僅適用于多端口驅動器、虛擬化環(huán)境或者NVHe over Fabrics陣列,此時一個NVMe控制器的情況表現(xiàn)的像是在訪問多個驅動器。但是,即使在單個NVM集、有耐久性要求的單個驅動器上,這些新功能依舊能起到一些作用。
Endurance Group,也就是耐久性組,它是NVM的集合,是由命名空間和未分配的存儲組成起來的。每個耐久性組都是一個單獨的存儲池并執(zhí)行自己的存儲磨損。此外,耐久性組還擁有自己的專用備用池.驅動器也會報告每個區(qū)塊的單獨磨損數(shù)據(jù)。在具有多個耐久性組的驅動器上,可以完全磨損一個耐久性組并使得其成為只讀組,其他的耐久性組依舊可以正常使用。
另外,特定的驅動器可以被設定為特定的NAND區(qū)域,也可以設置不同的NVM集或者耐久陸組,它們本質上是將其分割為多個相對獨立的驅動器。這樣不僅可以實現(xiàn)磨損管理的分離,而且可以提供嚴格的分區(qū)性能。云托管供應商可以將來自不同的客戶的VM數(shù)據(jù)放在不同的NVM集或者耐久性組上,以確保來自某一個客戶的繁忙工作不會損害另一個客戶的數(shù)據(jù)延遲。
可預測的延遲模式
新的可預測的延遲模式功能允許主機暫時暫停SSD控制器正在執(zhí)行的任何后臺操作,確保此時不會立即處理從主機系統(tǒng)提交新的IO命令。在這種情況下,驅動器能夠提供最佳、最一致的性能。SSD無法無限期地在這種狀態(tài)下運行,并且最終需要離開性能模式并進行后臺工作處理。此時驅動器可以提供運行評佔,確保自己在性能模式完成之前就切換回非確定性模式。
可預測的延遲模式通常用于主機軟件可以跨多個驅動器進行負載平衡的環(huán)境。高優(yōu)先級IO可以定向到當前處于確定性窗口的驅動器中優(yōu)先處理,而非確定性窗口中的驅動器可以單獨處理后臺需求,或者用于處理低優(yōu)先級的IO。在一組驅動器池中,每個驅動器都可以在確定性和非確定性操作之間交替運行,每個驅動器的窗口時間將取決于工作負載情況。如果負載均衡器工作正常,它將停止向驅動器發(fā)送對延遲敏感的IO命令,并目在驅動器達到其限制之前主動將其從確定性模式中呼出。此外,驅動器也可以配置成在達到閾值之前提供警告,因此主機系統(tǒng)無需經(jīng)常檢查狀態(tài)指示器以查看驅動器是否接近離開確定性窗口??深A測的延遲模式給予每個NVM集配置,因此很多集的驅動器可以在任何給定時間的每個模式中都有一些延遲配置,并目在整個NVM集中進行負載平衡。
可預測延遲模式也不是用于控制驅動器何時執(zhí)行后臺工作的第一個NVMe功能,NVMe 1.4添加了非操作電源狀態(tài)許可模式的功能,以便它可以在低功耗空閑狀態(tài)下要求驅動器不進行后臺工作。這里的目的是在使用電池供電或者關閉系統(tǒng)風扇的低功耗狀態(tài)下推遲后臺功能,這個功能不影響驅動器處于活動狀態(tài)時的后臺工作情況。
提交隊列關聯(lián)和命名空間寫保護
NVMe SSD通??梢灾С侄鄠€命令提交和完成隊列。目前它的主要用途是為每個CPU核心提供自己的隊列,這樣驅動程序就不再需要從內(nèi)核到內(nèi)核的同步來執(zhí)行普通的IO了。最近,Linux NVMe驅動程序也增加了將隊列用于特殊目的功能支持,比如為高優(yōu)先級命令創(chuàng)建專用的隊列,這些命令會被輪詢完成而不會等待中斷,或者每個核心具有單獨的隊列讀取命令。NVMe 1.4和之前提到的可預見的延遲模式為多個隊列添加了另一個潛在的用例,那就是將一個隊列和特定的NVM集進行關聯(lián)。此外,NVMe 1.4還允許主機通知SSD的NVM隊列設置計劃,這樣可以讓SSD控制器在使用可預測延遲模式時有機會進一步降低延遲或者提高QoS,當然這項功能是可選的。
此外,在命名空間寫保護方面,NVMe 1.4也作出了加強。NVMe命名空間可以是下列三種只讀模式中的一種:只讀直到下一個電源循環(huán)、只讀直到寫保護功能被禁用后的第一個電源循環(huán)、驅動器生命內(nèi)永久只讀。這樣的設置為嵌入式或者高安全性系統(tǒng)的關鍵性數(shù)據(jù)安全提供了一系列的選項。一個典型的用例是將操作系統(tǒng)或者最小恢復系統(tǒng)放置在寫保護的命名空間內(nèi),并且將用戶數(shù)據(jù)和應用程序保存在常規(guī)的讀寫命名空間中。這是NVMe開始為客戶端SSD提供多個命名空間時最引人矚目的功能之一,因為這項功能已經(jīng)普遍適用于普通移動和桌面操作系統(tǒng)。另外,受寫保護的命名空間可以使得驅動器本身參與保護操作系統(tǒng)免受意外或者篡改,并且比現(xiàn)有的保護內(nèi)存塊功能簡單很多。
NVMe的下一步
從技術發(fā)展角度來看,NVMe受到了開放式通道SSD的影響,這類SSD將全部或者部分閃存轉換成移除驅動器并掛接在CPU上。NVMe的一些功能正在受到這種新的模式的啟發(fā),包括上文中關于最佳區(qū)塊大小、數(shù)據(jù)對齊、NVM集和耐久性組的設計等方面。去年,微軟還成立了ProjectDenali,對開放性通道固態(tài)內(nèi)存進行了探討,希望能夠在低級控制和傳統(tǒng)的塊存儲之間提供易用性的最佳平衡,最終的目標是生成能夠被更廣泛采用的新標準。
總的來說,人們希望可以在NVMe上構建計算存儲設備的加速器和協(xié)處理器標準。目前已經(jīng)有公司開始開發(fā)或者已經(jīng)提供設備來承擔處理器的壓縮、加密、解密、搜索和AI推理等任務,并且是在數(shù)據(jù)存儲位置附近進行這些計算任務。標準化這些設備接口的工作目前依舊處于起步階段,但是在NVMe 1.5版本出現(xiàn)前的兩三年內(nèi),其中一些想法可能會變得足夠成熟,并能夠真正成為計算存儲的基礎設施標準,我們期待在接下來的發(fā)展中能夠看到這些新的進步。