如何啟用NVMeZNS
ZNS的硬件變化
在較高層次上,為了啟用ZNS,市場上的大多數SSD只需要更新固件。ZNS對SSD控制器或其他硬件組件沒有任何新的要求,僅通過更改固件,就可以為現有SSD實現此特性。
硬件中的關鍵因素在于SSD被設計成只支持ZNS。首先,也是最重要的一點,只使用ZNS的SSD不需要像傳統企業SSD那樣過度配置。ZNS SSD同時負責執行磨損平衡,但不再需要為垃圾回收過程提供很大的備用區域。使用得當,ZNS允許主機軟件避免SSD內部寫入放大(Write Amplification,即WA)的幾乎所有情況。企業級SSD通常使用高達28%的超額配置比率(在典型的3 DWPD模型上,每1024GB閃存可用800GB), ZNS SSD可以將幾乎所有的容量暴露給主機系統,同時不會影響高持續寫性能的能力。ZNS SSD仍然需要一些備用容量(如用于應對閃存耗盡時突然出現的故障),但西部數據表示,預計ZNS在過載比率方面可以降低大約10倍。
對WA的更好控制也意味著在某些用例下QLC NAND是一個更可行的選擇(否則需要TLC NAND)。企業存儲工作負載經常導致WA因子為2-5倍。使用ZNS,SSD本身幾乎不會引起WA,而合適的主機軟件可以避免引起很多WA,因此總體效果是提高SSD壽命,彌補QLC相對于TLC較低的耐久性。即使在ZNS SSD中,QLC NAND從根本上還是比TLC慢,但是在SSD中幾乎消除了后臺數據管理,意味著基于QLC的ZNS SSD可以在QoS指標上與基于TLC的傳統SSD競爭(盡管總吞吐量更低)。
ZNS支持的另一個主要硬件更改是DRAM需求的大幅降低。在傳統的基于塊的SSD中,閃存轉換層(FTL)需要1GB的DRAM來處理1TB的NAND閃存,用來存儲地址映射或間接表,記錄當前存儲每個邏輯塊地址(LBA)的物理NAND閃存地址。1GB / 1TB是FTL以4kB粒度管理flash的結果。ZNS消除了這一需求,它讓SSD管理每個區域數百MB的整個區域。追蹤包含每個區域的物理NAND擦除塊現在只需要很少的內存,甚至可以用控制器上的SRAM來完成,甚至可以用幾十TB閃存的SSD。ZNS并不能讓SSD完全不需要DRAM,因為SSD對每個區域需要存儲的元數據比傳統FTL需要為每個LBA存儲量要大,同時SSD可能會使用一些DRAM緩存。
軟件模型
為了與分區存儲設備一起工作,為傳統塊存儲設備編寫的驅動程序(和其他軟件)需要進行一些修改。最明顯的是,主機軟件必須遵守只能在區域內按順序寫入的新約束,但光這樣還不夠。分區存儲還使主機軟件負責更多的數據放置管理工作,處理這項工作首先要跟蹤每個區域的狀態。這比聽起來要復雜得多,ZNS采用與主機管理的SMR硬盤相同的可能區域狀態概念。技術上,分別對應SCSI和ATA命令集的ZBC和ZAC擴展:
這7個圓圈中的每一個都表示ZNS SSD上某個區域的可能狀態。這七個狀態中的一些狀態有一個明顯的目的:空區(Empty)和滿區(Full)被明顯標識出來。
(一個區域在沒有存儲滿其容量下,可以被置于Full狀態。在這些情況下,將一個區域置于Full狀態就像在燒錄后完成光盤:在該區域被重置(擦除)之前,不能再寫入任何內容。)
只讀(Read Only)和離線(Offline)狀態是當硬盤的閃存失敗時使用的錯誤狀態。雖然ZNS SSD減少了寫放大,但仍需要在硬件層面上執行損耗均衡。只讀和離線狀態只在整個硬盤生命周期結束時才會出現。因此,許多以分區存儲為目標的軟件不會對這些狀態做任何事情,一旦一個分區進入其中一種狀態,就會簡單地將整個設備視為死機。
現在還剩下三種狀態:隱式打開(Implicitly Opened)、顯式打開(Explicitly Opened)和關閉(Closed)。
處于這三種狀態之一的區域被認為是活動的。在任何給定時間,硬盤往往會限制可以打開(顯式或隱式)或活動區域的數量。產生這些限制是因為活動區域或開放區域需要一些額外的跟蹤信息。對于每個活動區域,硬盤需要跟蹤寫指針,該指針指示該區域已經使用了多少容量以及對該區域的下一次寫操作將在何處進行。寫指針對于滿區或空區不需要,因為滿區不能接受更多的寫操作,空區將從區域的開頭寫入。
一個區域必須打開才能接受新的寫操作。區域可以通過簡單地發出寫命令隱式地打開,也可以使用區域管理命令顯式地打開(該操作實際上不寫新數據)。
隱式和顯式打開區域之間的區別在于:SSD控制器可以自由地自動關閉通過寫命令隱式打開的區域;顯式打開的區域只有在主機軟件發出命令時才會處于關閉狀態。
如果ZNS SSD打開的區域數量達到最大值,并且它們都是顯式打開的,那么任何打開新區域的嘗試都將失敗。但是,如果其中一些區域只是隱式打開的,那么嘗試打開一個新區域將導致SSD關閉其中一個隱式打開的區域。
開放區和關閉區之間的區別允許硬盤保持對內部資源的實際限制,以處理對區域新的寫操作。在某種程度上,這只是從SMR硬盤的延續,但在閃存如何工作方面有一個相關的限制。現在,NAND閃存通常有大約16kB的頁面大小,但是ZNS SSD仍然支持對單個LBA的寫操作,通常是4kB(或512字節)。這意味著寫入一個區域可以使閃存單元在一個部分編程的狀態。即使在只執行頁面大小和正確對齊的寫操作時,由于SSD通常將頁面映射到物理內存單元的方式,單元格可能會一直處于部分編程狀態,直到進一步的寫操作到達。
處于部分編程狀態的閃存單元很容易發生讀取干擾錯誤,當試圖從該單元或相鄰單元讀取時,可能會改變部分編程單元的電壓。Open Channel SSD通過簡單地禁止從這類頁面讀取來處理這個問題,但是分區存儲模型試圖避免對讀取命令施加額外的限制。ZNS SSD通常會緩存最近寫入的數據,這樣讀取命令就可以在不接觸部分已編程的NAND頁面的情況下進行處理。用于這種緩存的可用內存限制了開放區域的數量。
如果要關閉一個帶有部分編程內存單元的開放區域,硬盤有兩種選擇:使用一些填充數據完成對這些單元的編程,跟蹤區域中的漏洞,并希望主機后面不要嘗試使用該區域的全部容量;或者硬盤可以一直緩沖最近寫入的數據,甚至對于關閉區域也是如此。根據硬盤希望支持的活動區域數量,仍然允許ZNS SSD使用比傳統SSD少得多的DRAM,因此這種方法在實踐中更有可能被使用。既支持分區IO命名空間又支持塊IO命名空間的SSD可能能夠同時保持其所有區域處于活動狀態或打開狀態。
原則上,ZNS SSD可以將每個單獨的閃存擦除塊作為一個單獨的區域,具體大小(可能是幾兆字節)取決于底層閃存。這將意味著對單個區域的寫入速度限制為對單個NAND閃存die的寫入速度。對于最近的TLC NAND閃存,單模寫入速度上升到大約82MB/s(三星第6代V-NAND),對于QLC單模寫入速度低于10MB/s。在實際中,硬盤傾向于聚集多個擦除塊(支持跨多個die和所有控制器通道)的區域大小,這樣對單個區域的順序寫(或讀)就可以像傳統的基于FTL SSD所支持的那樣快。
最近的一個帶有512GB ZNS原型SSD的西部數據演示顯示,該硬盤使用256MB的區域大小(總共2047個區域),但也支持2GB區域。在單個分區的命名空間中,所有區域將使用相同的區域大小,但是硬盤可以支持重新格式化命名空間以更改其區域大小,或者支持使用不同區域大小的多個命名空間。
提示
許多最新的NVMe特性允許SSD和主機軟件交換關于數據布局、訪問模式和生存周期的可選提示。這是主機的SSD驅動特性,而不需要雙方都支持使用該信息。ZNS使區域成為主機必須直接處理的顯式概念,但對SSD的其他一些內部操作采用提示方法。
ZNS SSD不執行傳統SSD意義上的垃圾回收,但它們仍然負責損耗均衡。這意味著硬盤將不得不重新定位數據到不同的物理NAND擦除塊,特別是如果硬盤存儲的都是不太會被修改的數據。重寫整個區域(比說,256MB)是一項相當大的后臺工作,它會對處理來自主機的IO命令的延遲產生顯著影響。ZNS SSD可以通知主機,它建議重新設置一個區域,因為它計劃很快在該區域上做一些后臺工作,并可以通知該項工作多久之后會開始進行。這為主機提供了重新設置區域的機會,如果仍然需要區域中的部分數據,則可能需要主機自己進行一些垃圾回收。(為了幫助處理這種情況,NVMe還添加了一個Copy命令,以便將不同的數據塊收集到單個連續的數據塊中,而不需要數據離開SSD。)
類似地,ZNS SSD可以建議主機將活動區域移動到滿狀態,可以通過寫滿區域的剩余容量,或者發出區域Finish命令。
當主機軟件同時注意以上提示并采取推薦的操作時,SSD就可以避免幾乎所有對性能影響較大的后臺操作或寫放大操作。但是因為這些僅僅是暗示,如果主機軟件忽略它們或者根本不符合要求,SSD仍然有義務在整個后臺處理過程中保存用戶數據。這可能會有一些副作用,例如在特殊情況下,硬盤必須將開放或活動區域移動到滿狀態,并且必須編寫主機軟件來容忍這些事件。完全消除寫放大也是不可能的,例如,靜態數據可能最終還是需要重寫,以防止由于累積的讀取干擾錯誤而產生不可糾正的錯誤。
支持多個寫線程
在一個區域內按順序寫入數據的要求,對軟件管理數據,特別是對現有數據的更新提出了明顯的挑戰。但是,當多個線程想要寫入同一區域時,也會造成性能瓶頸。發送到SSD的每個寫命令都需要定位到區域的寫指針指向的LBA。當多個線程寫入一個區域時,在線程檢查寫入指針的位置和寫入命令到達SSD之間存在寫入指針可以被另一個線程寫入的競爭條件,將導致寫入被SSD拒絕。為了防止這種情況發生,軟件必須在線程之間同步,以正確序列化對每個區域的寫操作。當有更多的線程在寫線程時,所產生的鎖開銷往往會導致寫性能下降,并且很難使隊列深度超過1。
為了解決這個限制,ZNS規范包括一個可選的append命令,可以用來代替write命令。append命令總是定位到區域的開頭,但是當SSD開始處理該命令時,它將在寫指針所在的位置寫入數據。當通知該命令完成時,SSD將數據實際著陸的LBA主機。這消除了同步需求,并允許多個線程同時將新數據寫入一個區域,而根本不需要core對core通信。缺點是主機軟件變得更加復雜,現在它必須在事后記錄數據位置,而不是在寫入數據之前嘗試分配空間。對于現有的IO API來說,即使是返回數據到達應用程序的地址也是一個挑戰,因為它們通常只設置為返回錯誤代碼給應用程序。
append命令不是解決這種可擴展性挑戰的唯一解決方案;它只是這個NVMe ZNS規范的初始版本中標準化的一個。在原型或非標準的分區SSD中已經提出和實現了其他解決方案。Radian內存多年來一直在其SSD上支持自己的分區存儲形式。他們的解決方案是允許在寫指針前一定距離內的無序寫操作。SSD將緩存這些寫操作,并將寫指針提前定位到數據目前寫入的第一個間隙。還有一項NVMe技術提案正在標準化,即ZRWA(Zone Random Write Area),允許在SSD緩存中對數據進行隨機寫入和就地覆蓋。與Zone Append命令相比,這兩種方法在SSD上都需要更多的資源,但可以證明,這使軟件開發人員的工作更加輕松。
-
控制器
+關注
關注
112文章
16416瀏覽量
178761 -
SSD
+關注
關注
21文章
2870瀏覽量
117583 -
存儲設備
+關注
關注
0文章
164瀏覽量
18627
原文標題:ZNS來了!一文看懂NVMe分區存儲!
文章出處:【微信號:SSDFans,微信公眾號:SSDFans】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論