懸崖邊的探討——聊一聊閃存的垃圾回收
隨著技術(shù)的進步以及成本的降低,閃存已經(jīng)越來越廣泛的被企業(yè)級數(shù)據(jù)中心作為存儲介質(zhì)使用。相比傳統(tǒng)的磁盤介質(zhì),閃存的優(yōu)勢顯而易見:速度快,耗電低,省空間。特別在速度方面,閃存具備壓倒性的優(yōu)勢。
比方說,客戶原來采用某款高端磁盤陣列的時候,處理某個作業(yè),需要花費6個小時。后來采用了閃存陣列,同樣處理該作業(yè),只需要1個小時就可以完成。閃存帶來的性能優(yōu)勢非常的明顯。
以上,并不是本文討論的重點。
本文的重點是,客戶剛剛采用閃存陣列的時候,處理作業(yè)只用1個小時,可是運行了一段時間之后,忽然有一天,客戶發(fā)現(xiàn)處理作業(yè)用了1小時25分鐘。于是,問題來了,客戶一方面覺得1小時20分鐘比6小時還是快多了,一方面也會想,為啥比起1小時,我現(xiàn)在處理作業(yè)的時間慢了4分之1?
由此,我們來了解一下,閃存中的“寫懸崖(Write-Cliff)”現(xiàn)象。
什么是垃圾回收?
閃存是電子類介質(zhì),它處理數(shù)據(jù)的寫入和傳統(tǒng)的磁類介質(zhì)(磁盤或者磁帶)不同。在使用磁盤時,如果我們有新數(shù)據(jù)寫入某區(qū)塊,而該區(qū)塊還存有舊數(shù)據(jù),那只需要簡單的進行覆蓋即可。而閃存不同,新數(shù)據(jù)寫入的區(qū)塊,必須是空白區(qū)塊,如果該區(qū)塊存有舊數(shù)據(jù),那么必須先對舊數(shù)據(jù)進行“擦除”(Erase)。是的,當(dāng)數(shù)據(jù)存儲的越來越多,理論上最多當(dāng)寫入的數(shù)據(jù)總量達(dá)到閃存提供的所有容量之后,再次寫入更新時,就必然會產(chǎn)生“擦除”。
相比于常規(guī)的讀取和寫入操作,擦除有2個特點。
***,擦除的速度比讀寫要慢。
第二,擦除的處理單位要比讀寫大。
目前業(yè)界的閃存,基本上,讀操作的處理單位不大于4KB,寫操作的處理單位不小于4KB,而擦除的處理單位則是不小于1MB。這意味著,如果要寫入4KB的數(shù)據(jù),到某個已存有4KB舊數(shù)據(jù)的區(qū)塊,那我首先需要擦除其周邊1MB的區(qū)塊空間。
這相當(dāng)于您買了一套二手房三居室,規(guī)定要求說不能直接住,必須先還原成毛坯房再重新裝修,而且要求您必須先把整個小區(qū)250個住戶的房子全部恢復(fù)成毛坯房,然后才能重新裝修自己家??墒瞧溆?49個鄰居住的好好的,他們家里的東西怎么辦,答案只有一個,就是請他們?nèi)堪鸭野嶙?,搬到其他小區(qū)空著的房子里去。(好吧,強制拆遷啦!?。┊?dāng)然,搬完之后有個好處,就是未來再有249個新住戶進來,他們可以就在毛坯房的基礎(chǔ)之上直接進行裝修了(1MB一次性全部擦除)。
以上過程,我們稱之為閃存擦除效應(yīng)帶來的“垃圾回收”。為了更清晰的描述這個過程,借(Chao) 用(Xi) 某閃存廠商的圖片,來更為清晰的解釋一下。
簡便起見,如下圖所示,假設(shè)某閃存設(shè)備一共提供了16個可寫的小塊,一次擦除必須以4個小塊為單位。
首先,我們寫入了一個“MyFile.doc”文件,占用了6個小塊,由于現(xiàn)在的16個塊都是“干凈”的空白狀態(tài),所以直接寫入即可。如下圖。
然后,我們更新了“MyFile.doc”文件。注意,在這里,作為用戶,我們認(rèn)為自己是在原來的位置上對文件數(shù)據(jù)進行了更新。但是閃存為了更快的完成處理,會物理上將新數(shù)據(jù)寫入另外的“干凈”區(qū)塊,并將原有舊數(shù)據(jù)所在區(qū)塊標(biāo)記為“失效”狀態(tài)。如下圖(灰色代表“失效,未擦除”數(shù)據(jù)塊,藍(lán)色代表“已占用”數(shù)據(jù)塊,白色代表“干凈,可寫入”數(shù)據(jù)塊)。
(同時為了解決應(yīng)用程序地址和實際物理存儲地址的對應(yīng)問題,閃存加入了“Flash Translation Layer”,用來實現(xiàn)上述兩個地址的映射。)
接下來,我們又需要寫入一個新文件“AnotherFile.doc”,同樣占用6個小塊,但是現(xiàn)在上圖中只剩下4個空白的“干凈”小塊了。因此,我們需要擦除左上角“失效”的4個小塊,擦完之后如下圖所示。
接下來,新的數(shù)據(jù)就可以被寫入到左上和右下總共的6個“干凈”小塊了。
現(xiàn)在,我們寫入***一個文件,需占用3個小塊??梢詮纳蠄D看到,空白“干凈”小塊只剩2個了。另外還有2個“失效”小塊,但是由于與有效數(shù)據(jù)同處一個擦除區(qū)域,無法直接擦除。因此,我們就需要進行數(shù)據(jù)的移動,如下圖所示,從而騰出一個整體的空間,使得擦除可以進行。這一步,就是之前講的鄰居搬家。
擦除完之后,我們就可以寫入占用了3個小塊的新文件了!
閃存“垃圾回收”帶來的“寫懸崖”和“寫放大”
回到文章一開始客戶遇到的性能下降25%的問題,在我們了解完閃存垃圾回收的過程之后,就很容易理解了。一臺40TB容量的閃存運到客戶現(xiàn)場,起始都是“干凈”的空白小塊,寫入速度很快。但隨著數(shù)據(jù)的不斷更新,或早或晚必然會出現(xiàn)區(qū)塊間數(shù)據(jù)搬運,數(shù)據(jù)擦除等后臺垃圾回收的相關(guān)操作,從而提供“干凈”的小塊給后續(xù)的寫入操作。這些操作和前端應(yīng)用程序并行,導(dǎo)致了性能的下降,我們稱之為“寫懸崖(Write-Cliff)”。
“寫懸崖”僅僅是垃圾回收帶來的問題之一。垃圾回收還帶來的另外一個問題,叫做“寫放大”。我們都知道閃存的每個Cell(顆粒)都是有寫入次數(shù)的壽命限制的。垃圾回收導(dǎo)致了額外的Cell寫入,加速了Cell壽命消耗。我們稱之為“寫放大(Write-Amplification)”。
如何處理“寫懸崖”
寫懸崖和寫放大都是閃存介質(zhì)與生俱來的特性,無論是SSD固態(tài)硬盤,還是目前的全閃存陣列廠商,都無法避免這兩個問題。
閃存廠商一般會通過介質(zhì)材料,算法以及架構(gòu)的優(yōu)化等手段,來將這兩種影響控制在一定的范圍內(nèi)。同時,對該問題處理的效果,也是衡量閃存陣列能力的因素之一。比如目前業(yè)界市場占用率很高的某閃存陣列廠商,宣稱通過以下手段來優(yōu)化寫懸崖的問題:
首先,采用“超供給”方式,通過提供更多的顆粒數(shù)量(比如用戶可見容量40TB,而實際物理容量超過67TB),用于減緩整體閃存壽命的磨損,并實現(xiàn)更為靈活的預(yù)防性垃圾回收。
同時,采用了“帶外”的垃圾回收處理機制,也就是為垃圾回收配置了專門的處理引擎,從而不占用處理前端應(yīng)用數(shù)據(jù)IO的硬件資源。
此外還有均衡磨損算法,監(jiān)測機制等手段,來優(yōu)化緩解這兩個問題。
消除誤區(qū),“寫懸崖”并不可怕
***,需要說明的是,寫懸崖并不可怕。
即使寫懸崖帶了的性能的降低,但速度降下來之后,處理得當(dāng)?shù)拈W存陣列,其性能還是要遠(yuǎn)遠(yuǎn)高于傳統(tǒng)磁盤陣列。好比您以5塊錢一股的價格買了一只股票,***的時候股票價格飆升到了30塊錢一股,但后來降到了25塊錢一股,并在25塊錢平穩(wěn)下來。那么整體來看,收益還是很好的。
以下是某廠商公布其全閃存陣列“寫懸崖”測試的測試結(jié)果,我們可以看到,“寫懸崖”發(fā)生后,該陣列依然運行在一個很高的吞吐量水平上。
當(dāng)然,在上面的圖中我們也看到了另外一個廠商的閃存產(chǎn)品,出現(xiàn)了嚴(yán)重的寫懸崖問題。所以在對閃存陣列選型時,一定要搞清楚閃存陣列廠商是否對該問題進行過優(yōu)化,并***讓廠商給出一些有說服力的數(shù)據(jù)或者測試報告。