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