李明江 陳 仁
1(黔南民族師范學(xué)院計算機與信息學(xué)院人工智能與大數(shù)據(jù)應(yīng)用技術(shù)研究所 貴州 都勻 558000) 2(中科院上海技術(shù)物理研究所中國科學(xué)院紅外探測與成像技術(shù)重點實驗室 上海 200083)
近年來,由于基于閃存(主要是NAND Flash)的固態(tài)存儲設(shè)備具有速度快、延時低、功耗低、抗震、體積小等優(yōu)點[1],無論是在消費領(lǐng)域,還是在企業(yè)數(shù)據(jù)中心,抑或是在移動領(lǐng)域(如eMMC、UFS等),固態(tài)存儲設(shè)備都得到廣泛的使用。但與傳統(tǒng)磁性硬盤相比,固態(tài)存儲設(shè)備在容量和價格方面卻不占優(yōu)勢。為解決這個問題,閃存一直朝著高密度方向發(fā)展,從早期的2D SLC(單個存儲單元存儲1比特數(shù)據(jù)的二維閃存),到現(xiàn)在廣泛使用的3D TLC(單個存儲單元存儲3比特數(shù)據(jù)的三維閃存),存儲密度越來越高,單比特數(shù)據(jù)成本越來越低,使得固態(tài)存儲設(shè)備在容量和價格方面與傳統(tǒng)硬盤相當。但是,閃存存儲密度提升的同時,閃存的性能和壽命也是越來越低。
為解決TLC性能差的問題,SLC緩存算法被廣泛應(yīng)用在固態(tài)存儲設(shè)備。傳統(tǒng)SLC緩存算法[2-4]思路是,在固態(tài)存儲設(shè)備中,一些TLC塊(Block)配置成SLC緩存使用,用戶寫入數(shù)據(jù)時,如果當前設(shè)備中有空閑SLC緩存,數(shù)據(jù)則會被優(yōu)先寫入到這些緩存中。當系統(tǒng)空閑時,這些SLC緩存的數(shù)據(jù)會被搬到TLC塊中。SLC緩存算法雖然能提升固態(tài)存儲設(shè)備突發(fā)寫入(Burst write)性能,但是由于數(shù)據(jù)先寫入到SLC,然后還是要搬到TLC,這會引入額外的寫放大,影響系統(tǒng)的壽命(Endurance)。另外,當SLC緩存耗盡或即將耗盡的時候,為釋放SLC緩存空間,SLC數(shù)據(jù)到TLC空間數(shù)據(jù)搬移的垃圾回收會被觸發(fā),這時系統(tǒng)寫入性能會出現(xiàn)斷崖式下降。
為減小SLC緩存算法對存儲設(shè)備壽命的影響,有學(xué)者提出基于用戶數(shù)據(jù)冷熱程度使用SLC緩存[5-6],即當用戶寫入的數(shù)據(jù)是熱數(shù)據(jù)時,熱數(shù)據(jù)會被寫入到SLC緩存,而對冷數(shù)據(jù),數(shù)據(jù)則被直接寫入到TLC塊中。這些算法滿足了熱數(shù)據(jù)寫入的高性能需求,同時減少了數(shù)據(jù)從SLC到TLC的搬移,減小了系統(tǒng)的寫放大,提升了存儲設(shè)備的壽命。但是,當SLC緩存耗盡的時候,由于需要釋放SLC緩存空間,SLC緩存垃圾回收導(dǎo)致用戶寫入性能變差的問題沒有得到解決或者緩解。
用戶數(shù)據(jù)一般都是以文件的形式存儲在存儲設(shè)備上的。本文在前人研究的基礎(chǔ)上,從文件系統(tǒng)特征出發(fā),根據(jù)數(shù)據(jù)的類型和特征,把用戶數(shù)據(jù)、文件元數(shù)據(jù)(meta)、日志數(shù)據(jù)(Journal)寫入到不同的存儲空間。該算法不僅改善了系統(tǒng)突發(fā)寫入性能,而且改善了SLC緩存空間耗盡下系統(tǒng)的寫入性能,同時兼顧了系統(tǒng)的壽命。
閃存根據(jù)其存儲密度,一般分為SLC、MLC和TLC。SLC(Single Level Cell),指閃存每個存儲單元存儲1比特的數(shù)據(jù);MLC(Multiple Level Cell)和TLC(Triple Level Cell)則是指每個存儲單元能存儲2比特和3比特的數(shù)據(jù)。同SLC相比,在同樣尺寸的晶元上,MLC和TLC存儲的數(shù)據(jù)量分別是SLC的2倍和3倍。閃存密度的提升增加了閃存的容量,降低了閃存單比特的成本。但是,閃存密度提升帶來的不利因素則是閃存性能的下降以及閃存壽命的降低。
從表1可以看到,TLC寫入性能只有SLC的1/3,這就是為什么需要SLC緩存來提升系統(tǒng)突發(fā)寫入性能的原因。在擦寫次數(shù)(壽命)方面,TLC只有SLC的1%,TLC的耐寫性大大減小,因此在使用SLC緩存提升性能的同時,還需要考慮到SLC緩存對TLC壽命的影響,SLC緩存算法應(yīng)該盡量減小對系統(tǒng)壽命的影響。
表1 SLC、MLC和TLC參數(shù)對比表[7]
為了解決TLC等高密度閃存性能差的問題,SLC緩存設(shè)計被應(yīng)用到固態(tài)存儲設(shè)備中。在一個基于TLC的固態(tài)存儲設(shè)備中,一部分TLC配置成SLC工作模式,數(shù)據(jù)會被臨時寫到SLC緩存中,然后這些數(shù)據(jù)最終需要存儲到TLC閃存空間。典型的SLC緩存架構(gòu)如圖1所示。
假設(shè)用戶寫入的總數(shù)據(jù)量為T,其中寫入到SLC緩存的數(shù)據(jù)量占比為x(0≤x≤1),則直接寫入到TLC中的數(shù)據(jù)量占比為1-x。在釋放SLC緩存空間的時候,假設(shè)從SLC到TLC搬動的有效數(shù)據(jù)占比為y(0≤y≤1)。寫入到閃存的數(shù)據(jù)包括:
(1) 用戶寫到SLC緩存的數(shù)據(jù):T×x。
(2) 用戶直接寫到TLC的數(shù)據(jù):T×(1-x)。
(3) SLC緩存垃圾回收寫入到TLC的數(shù)據(jù):T×x×y。
總共寫入到閃存的數(shù)據(jù)量為T×(1+x×y),因此SLC緩存機制引入的寫放大為:
WA=T×(1+x×y)/T=1+x×y
(1)
可以看出,SLC緩存會導(dǎo)致額外的寫放大(1+x×y),具體來說,寫入到SLC緩存的數(shù)據(jù)量(x)越多以及SLC緩存垃圾回收時搬動的有效數(shù)據(jù)(y)越多,則寫放大越大,對系統(tǒng)壽命影響越大,反之亦然。
在SLC數(shù)據(jù)向TLC遷移的垃圾回收時,搬動的數(shù)據(jù)越少(即y越小),則寫放大越小,對系統(tǒng)性能和壽命影響越小。而該數(shù)據(jù)與緩存在SLC的數(shù)據(jù)類型緊密相關(guān)。
(1) 如果冷數(shù)據(jù)(即不經(jīng)常更新的數(shù)據(jù),比如視頻、圖像、音頻等類型數(shù)據(jù))寫入SLC緩存空間,這些數(shù)據(jù)在SLC緩存期間幾乎不會被更新或重寫,在騰出SLC空間的時候,有多少數(shù)據(jù)寫入到SLC緩存,就幾乎需要原封不動地把這些數(shù)據(jù)遷移到TLC。這意味著對冷數(shù)據(jù),y接近1,冷數(shù)據(jù)寫入到SLC緩存對系統(tǒng)性能和壽命影響最大。
(2) 如果數(shù)據(jù)是熱數(shù)據(jù)(即被頻繁更新的數(shù)據(jù)),這些數(shù)據(jù)在寫入到SLC緩存的時候,很大概率會被更新,因此在釋放SLC緩存空間時,往TLC搬動的數(shù)據(jù)占比y會遠小于1。因此熱數(shù)據(jù)適合寫入到SLC緩存空間,性能提升的同時,對系統(tǒng)性能和壽命影響很小。
(3) 特別地,有些系統(tǒng)數(shù)據(jù)(比如文件系統(tǒng)的日志文件),系統(tǒng)寫入的時候是在一個存儲空間循環(huán)寫入,這些數(shù)據(jù)如果被寫入到SLC緩存空間,會導(dǎo)致整個SLC塊被變成無效,因此在回收SLC緩存空間的時候,不需要做真正意義上的垃圾回收,只需執(zhí)行SLC塊的擦除操作,無須數(shù)據(jù)的搬移,即y=0。對于這種數(shù)據(jù)類型,即使觸發(fā)垃圾回收,因為無須數(shù)據(jù)搬移,系統(tǒng)性能和壽命都能同時保證。但這前提是必須避免這些數(shù)據(jù)和熱數(shù)據(jù)混合寫入到SLC緩存,否則在做垃圾回收的時候,還是需要把熱數(shù)據(jù)搬移到TLC空間。因此對諸如日志文件類型的數(shù)據(jù),應(yīng)該寫入到單獨的SLC緩存空間。
本文以主流的EXT4文件系統(tǒng)為例,來分析文件數(shù)據(jù)類型。EXT4是第四代擴展文件系統(tǒng),是Linux系統(tǒng)下的日志文件系統(tǒng),其數(shù)據(jù)類型包括用戶數(shù)據(jù)、文件元數(shù)據(jù)(meta data)和日志(journal)數(shù)據(jù)。文件元數(shù)據(jù)是文件系統(tǒng)管理文件所需的數(shù)據(jù),而日志數(shù)據(jù)則是用來確保文件數(shù)據(jù)一致性而加入的數(shù)據(jù)。
EXT4有三種日志模式,分別為:journal、ordered、writeback。
(1) journal模式。journal模式提供了完全的數(shù)據(jù)塊和元數(shù)據(jù)塊的日志,所有的數(shù)據(jù)都會被先寫入到日志里,然后再寫入存儲設(shè)備上。在文件系統(tǒng)崩潰的時候,日志就可以進行重放,把數(shù)據(jù)和元數(shù)據(jù)帶回到一個一致性的狀態(tài)。journal模式性能是三種模式中最低的,因為所有的數(shù)據(jù)都需要日志來記錄。
(2) ordered模式。ordered模式下,EXT4文件系統(tǒng)只提供元數(shù)據(jù)的日志,但它邏輯上將與數(shù)據(jù)更改相關(guān)的元數(shù)據(jù)信息與數(shù)據(jù)塊分組到一個稱為事務(wù)的單元中。當需要把元數(shù)據(jù)寫入到存儲設(shè)備上的時候,與元數(shù)據(jù)關(guān)聯(lián)的數(shù)據(jù)塊會首先寫入。也就是數(shù)據(jù)先寫入,再做元數(shù)據(jù)的日志。
(3) writeback模式。writeback模式下,當元數(shù)據(jù)提交到日志后,數(shù)據(jù)可以直接被提交到存儲設(shè)備,即會做元數(shù)據(jù)日志,數(shù)據(jù)不做日志,并且不保證數(shù)據(jù)比元數(shù)據(jù)先寫入到磁盤。
對用戶數(shù)據(jù)和元數(shù)據(jù)來說,包含有頻繁更新的數(shù)據(jù)(即熱數(shù)據(jù))和不頻繁更新的數(shù)據(jù)(即冷數(shù)據(jù)),取決于用戶存儲的數(shù)據(jù)類型;而對日志數(shù)據(jù)來說,主機為它分配一個獨立的邏輯地址空間,文件系統(tǒng)在這個空間連續(xù)寫入并循環(huán)使用。
本文將針對文件系統(tǒng)類型,尤其是日志文件系統(tǒng)特點,設(shè)計一種全新的SLC緩存方案,不僅能提升系統(tǒng)性能,而且能改善在回收SLC緩存空間期間的系統(tǒng)性能,同時又能減小SLC緩存給存儲系統(tǒng)壽命造成的影響。
從前面SLC緩存算法分析可得出結(jié)論,熱數(shù)據(jù)和冷數(shù)據(jù)分開存儲,即熱數(shù)據(jù)先寫到SLC緩存再回收到TLC空間,冷數(shù)據(jù)直接寫到TLC空間,這樣不僅能滿足熱數(shù)據(jù)的寫入性能需求,而且能減小SLC緩存算法對系統(tǒng)壽命影響。冷熱數(shù)據(jù)的區(qū)分,可以在主機端來區(qū)分,比如:對視頻、圖像、語音等數(shù)據(jù),主機端根據(jù)文件的后綴名,把它標識為冷數(shù)據(jù),對其他數(shù)據(jù)則把它標識為熱數(shù)據(jù)。主機在寫這些數(shù)據(jù)的時候,在相應(yīng)的寫入命令中加上標識。
在設(shè)備端,固件根據(jù)數(shù)據(jù)的冷熱標識,把數(shù)據(jù)寫到不同的閃存空間,如圖2所示。
寫入到SLC緩存空間的數(shù)據(jù),當SLC緩存滿了的時候,需要對SLC緩存做垃圾回收,即把SLC塊上的有效數(shù)據(jù)搬到TLC空間,如圖3所示。
熱數(shù)據(jù)由于被頻繁更新,因此在SLC塊中,很多數(shù)據(jù)都是無效的,釋放出SLC緩存空間需要搬動的有效數(shù)據(jù)很少,即式(1)中的y很小,因此能減小SLC緩存算法對存儲性能和壽命的影響。
注意到文件系統(tǒng)中日志數(shù)據(jù)的特殊性,即順序?qū)懭牒脱h(huán)寫入的特點,固態(tài)存儲設(shè)備為其再分配一個獨立的SLC存儲空間,避免和其他非日志的數(shù)據(jù)寫在同一個閃存空間。這樣做的好處是,在釋放日志SLC緩存空間的時候,可以快速回收,無須數(shù)據(jù)的搬移。
因此,在冷熱數(shù)據(jù)分開存儲的基礎(chǔ)上,SLC空間被分成兩部分,一部分用以緩存熱數(shù)據(jù),一部分存儲日志數(shù)據(jù),如圖4所示。
如圖5所示,假設(shè)日志文件邏輯空間為LBA 0-MAX,主機按邏輯地址依次寫入日志數(shù)據(jù),當邏輯空間寫滿后,主機則又從起始邏輯地址(即LBA 0)寫入。假設(shè)每個SLC塊能寫入100個邏輯塊的數(shù)據(jù),當寫滿SLC塊blockn的時候,block 0的數(shù)據(jù)則全部變成無效。在回收SLC空間的時候,無須做任何數(shù)據(jù)的搬移,只需擦除block 0就能得到一個空閑的SLC塊。
對日志文件之外的數(shù)據(jù),由于寫入的隨機性和不確定性,因此無法做到零數(shù)據(jù)搬移的垃圾回收。前述的冷熱數(shù)據(jù)分開存儲到不同的閃存空間,能最大化減小垃圾回收時的數(shù)據(jù)搬移;但對日志數(shù)據(jù),根據(jù)其寫入的特殊性(順序循環(huán)寫入),存儲設(shè)備為其分配獨立的日志文件數(shù)據(jù)緩存空間,做到了零數(shù)據(jù)搬移的垃圾回收,不僅避免了緩存空間垃圾回收對系統(tǒng)性能的影響,而且避免了閃存緩存空間垃圾回收引入的寫放大(y=0)。
在主機端,設(shè)備驅(qū)動層根據(jù)數(shù)據(jù)類型,給不同的數(shù)據(jù)打上標志:圖像、視頻和音頻數(shù)據(jù)(根據(jù)文件后綴名)標識為冷數(shù)據(jù);日志文件標識為日志數(shù)據(jù);其他數(shù)據(jù)類型標識為熱數(shù)據(jù)。
在主機往設(shè)備寫數(shù)據(jù)的時候,文件數(shù)據(jù)類型標志包含在寫入命令當中。
在設(shè)備端,實現(xiàn)了相應(yīng)的SLC緩存算法,主要包括:
1) 為不同的數(shù)據(jù)類型分配不同的閃存空間(熱數(shù)據(jù)SLC緩存空間、日志SLC緩存空間和主TLC存儲空間)。
2) 根據(jù)主機寫入命令中的數(shù)據(jù)類型標志,把數(shù)據(jù)寫入到對應(yīng)的閃存空間。
3) SLC緩存空間垃圾回收算法。
(1) 對日志SLC緩存空間,無須數(shù)據(jù)搬移就能釋放SLC空間,只需執(zhí)行前臺垃圾回收。
(2) 對熱數(shù)據(jù)SLC緩存空間,只做后臺垃圾回收,即系統(tǒng)空閑的時候釋放SLC緩存空間;如果主機在寫入的時候沒有足夠多SLC緩存空間,熱數(shù)據(jù)會被直接寫入到主TLC空間。不做前臺SLC緩存垃圾回收,是出于性能考慮,因為直接寫TLC性能會比在做垃圾回收時的性能要好,從而避免了系統(tǒng)寫入性能出現(xiàn)斷崖式下降。
基于文件系統(tǒng)特征的SLC緩存方案如圖6所示。
實驗?zāi)康氖球炞C新的SLC算法在不同的日志模式下,對系統(tǒng)性能的提升以及對系統(tǒng)壽命(寫放大)的改善。
主機端使用文件系統(tǒng)為EXT4的Linux操作系統(tǒng),并加入新的驅(qū)動程序,以支持文件系統(tǒng)數(shù)據(jù)類型的甄別,并在寫入命令中打上數(shù)據(jù)類型標記。
設(shè)備端是一塊基于PCIe3.0x2的120 GB SSD開發(fā)板,后端四個閃存通道,每個閃存通道各掛了一片32 GB的3D TLC閃存。SSD開發(fā)板固件分別實現(xiàn)了兩種SLC算法:
(1) 傳統(tǒng)SLC緩存算法:分配4 GB SLC緩存空間,主機寫入的數(shù)據(jù)(無數(shù)據(jù)分類)會被先寫到SLC緩存,如果緩存耗盡,數(shù)據(jù)直接寫入到TLC空間;在系統(tǒng)空閑的時候,SLC緩存會被后臺垃圾回收釋放空間。
(2) 新的SLC緩存算法:分配2 GB SLC緩存空間用以存儲日志數(shù)據(jù);分配4 GB SLC緩存空間存儲熱數(shù)據(jù);冷數(shù)據(jù)沒有SLC緩存空間,直接寫入到TLC空間。熱數(shù)據(jù)寫入的時候,如果有可用的SLC緩存空間,數(shù)據(jù)會被寫入到SLC空間,否則,熱數(shù)據(jù)則被直接寫入到TLC空間。在系統(tǒng)空閑的時候,SLC緩存會被后臺垃圾回收釋放空間。
我們使用Filebench來生成各種實際工作負載,然后測試對應(yīng)負載下的性能數(shù)據(jù)。結(jié)果如表2、圖7、圖8所示。
表2 不同的測試負載
從測試結(jié)果來看,無論是在Journal模式還是在Ordered模式下,本文提出的SLC緩存方案較傳統(tǒng)SLC方案在性能上都有不同幅度的提升,尤其是在日志數(shù)據(jù)占比比較大的情況下,比如Varmail在Journal模式下,性能提升達到50%,這得益于獨立的日志數(shù)據(jù)SLC緩存空間的使用。獨立的日志SLC緩存空間,在寫入日志數(shù)據(jù)的時候,即使在SLC緩存耗盡的情況下,由于其無須做真正的數(shù)據(jù)搬移就能釋放SLC空間,保證了日志數(shù)據(jù)總是能寫入到SLC空間,從而提升了整個系統(tǒng)性能。
測試使用FIO生成如表3所示測試序列。
表3 FIO測試負載
基于上面的負載,分別做兩個測試:一個測試是腳本不斷運行,其間沒有空閑時間;另一個測試是腳本中間加入足夠多的空閑時間。兩者的差異是,前者由于設(shè)備一直處于工作狀態(tài),沒有后臺操作來清空熱數(shù)據(jù)的SLC緩存空間,所以冷熱數(shù)據(jù)幾乎都會被直接寫到TLC空間;而后者,設(shè)備有空閑時間,它會在空閑的時候把SLC緩存上的數(shù)據(jù)搬到TLC空間,所以主機寫入的熱數(shù)據(jù),幾乎全部會寫入到SLC緩存中。測試結(jié)果如圖9、圖10所示。
與傳統(tǒng)SLC緩存方案相比,本文提出的基于文件系統(tǒng)特征的SLC緩存方案能大大減小寫放大,從而提升閃存的壽命。同樣的SLC緩存方案,我們可以看到,當系統(tǒng)有空閑時間的時候,系統(tǒng)寫放大會比沒有空閑時間的時候要大。那是因為,當系統(tǒng)沒有空閑的時候,主機寫入的數(shù)據(jù)在SLC緩存寫滿后,會被直接寫到TLC中;而當系統(tǒng)有足夠多的空閑時間,主機寫入的數(shù)據(jù)(熱數(shù)據(jù))幾乎被全部寫入到SLC緩存中,之后被后臺垃圾回收把數(shù)據(jù)從SLC緩存空間搬移到TLC空間。根據(jù)前面的分析(式(1)),主機寫入到SLC緩存空間的數(shù)據(jù)越少,SLC緩存導(dǎo)致的寫放大越小,反之亦然,實驗結(jié)果和理論分析相符。
傳統(tǒng)SLC緩存方案解決了基于TLC存儲空間突發(fā)寫入性能不足的問題,但它會引入比較大的寫放大,從而影響系統(tǒng)寫入壽命;另外,當SLC緩存耗盡的時候,系統(tǒng)性能急劇下降的問題沒有得到解決。本文提出的基于文件系統(tǒng)特征的SLC緩存方案,把文件數(shù)據(jù)分為熱數(shù)據(jù)、冷數(shù)據(jù)和日志數(shù)據(jù),尤其是針對日志數(shù)據(jù)使用獨立的SLC緩存空間,大大減小了系統(tǒng)的寫放大,同時也提升了當SLC緩存空間耗盡下的系統(tǒng)寫入性能。值得注意的是,即使對非日志文件系統(tǒng),本文提出的熱數(shù)據(jù)進入SLC緩存、冷數(shù)據(jù)直接寫入到TLC主空間的策略,也能減少不必要的數(shù)據(jù)(沒有性能需求的數(shù)據(jù))寫入到SLC緩存空間,這樣有助于改善熱數(shù)據(jù)性能和減小系統(tǒng)的寫放大。