一月
28

談談固態硬碟(Solid State Drive, SSD)


泰國水患,讓更多人考慮使用SSD

因為泰國的水患,傳統磁性硬碟的價格水漲船高,於是很多不是為了想要大容量,只是單純為了裝機而買電腦的人,便打起了改買現在看起來高貴,但是又沒有真的那麼貴的固態硬碟(Solid State Drive, SSD)的主意。在與固態硬碟相關的flash memory(快閃記憶體)議題中打滾多年,正好最近也受EETimes之邀,寫了一篇跟SSD/flash memory在斷電後的資料安全性問題相關的文章,在文章面世之前,決定先用中文,跟朋友們分享一些我的心得。

SSD的優劣

有別於傳統磁性硬碟的機械讀取裝置,主要以flash memory晶片為儲存媒體的solid state drive先天在讀取速度上就有相當的優勢。以目前主流用於SSD的NAND MLC晶片來說,單一的flash memory晶片可以在40 us內讀取4K page的資料(相當於每秒100MB),延遲方面,us級(十萬分之一秒)的延遲遠小於硬碟機械讀取臂所需要的數ms (千分之一秒)時間。若是SSD能夠同時讀取、並且分散連續資料的儲存,SSD讀取時的內部資料傳輸率可以達到相當驚人的數字。因此,如果把作業系統或是需要大量讀取地圖檔案的遊戲,放進SSD裡面,的確會明顯地感受到開機時間、開遊戲的時間、載入地圖的時間變短了。只是一旦這些資料都放進了主記憶體中,不需要再從儲存裝置裡讀取資料後,所能感覺到的效能提昇便十分有限。

不過在寫入資料的時候,flash memory的表現就沒那麼理想了。以目前高容量的MLC晶片而言,寫入本身就需要2 ms的時間,這還不包括其他與寫入本身無關的內部資料管理,不過透過多顆晶片平行寫入,理想狀態下,SSD依然可以取得數倍於硬碟的寫入速度。flash memory資料的寫入,並不像傳統硬碟那般地直覺。因為flash memory先天硬體的限制,flash memory在寫入的時候以一個page(目前多為4KB)為單位,但是一個page一旦寫入後,就必須整個page被清除(erase)後才能重新再被寫入。偏偏清除必須以一個block(通常是64到256個page)為單位進行,清除一次,往往也需要數個ms的時間,而且每個page本身也有清除次數的限制(MLC通常是5000次左右),所以為了效能跟SSD壽命的考量,flash memory寫入時通常會先找空白的page寫入新資料(out-of-place update),然後更新檔案系統的對應表,而原先的版本,就成為SSD上的垃圾(garbage)。

不過任由垃圾無限制的增加,也會使得SSD遇上即使只存了一點資料,卻沒辦法再寫入的窘境(因為可利用空間都是這些還沒被清除過的垃圾)。因此,SSD通常會利用garbage collection的技巧,在SSD的可用空間低於一定量時,開始清理這些垃圾,好一點的SSD會挑SSD閒置的時候做garbage collection。清理這些垃圾的過程,就像是都市更新一樣,往往需要搬移大量還可用的資料到其他地方,再把這些充滿垃圾的block一一清除。因此,如果SSD資料多到一定程度,每次寫入都非常有可能引發一次的垃圾大戰,此時SSD的寫入效能,可能會比傳統硬碟還糟糕。因此,在效能上,SSD並不完全適合作為資料儲存的硬碟,至少不適合拿來放常常會更動、寫入的資料。

當然,SSD還有其他的好處,例如沒有噪音、不怕震動,耗電量也遠低於傳統硬碟等,但是,以目前的科技,我不認為個人資料儲存只依賴SSD是正確的作法。

SSD斷電的安全性

去年六月的DAC中,有幸投上了一篇Understanding the Impact of Power Loss on Flash Memory的論文,討論SSD在斷電後的資料安全性。這篇文章的內容並非危言聳聽,我就有兩個使用MacBook Air的朋友,在意外當機後,SSD的資料全毀,完全無法進入系統中,即使外接到別台電腦,也無法讀取SSD當中的資料。SSD這種「寧為玉碎、勿為瓦全」的特性,基本上是因為前面提過為了最佳化寫入時間,SSD必須多一層機制,利用一個對照表把這些實際上不連續的pages假裝成像是傳統的硬碟一樣。一旦這個對照表的某些資料不完全,SSD便會陷入全毀的結局。其實SSD使用的這種機制,也並非SSD特有,也有不少OS相關的論文討論怎麼更有效率、更安全的管理這類的檔案系統。但是為什麼看起來這麼天衣無縫的東西,遇上了SSD還是會有問題呢?為了了解問題的成因,我們從各大flash memory的製造商手中拿到了許多目前在線上使用的晶片,透過實際的量測,揭開答案的真面目。

傳統上,我們都直覺地認為給一個東西越多時間做事,事情就越接近完成。但是flash memory並非如此。在我們實驗的過程中,我們發現很多時候,給flash memory越多時間完成寫入,並不見得一定能獲得更完整的資料。而且即使這些資料勉強寫入了,在我們重複讀取、或是利用烤箱模擬flash memory放久一點後的資料完整性時,都會發現這些資料即使寫入了,也不安全。他們可能在多讀幾次以後就面目全非、也可能在三、五年後長了雀斑。所以,對SSD而言,任何因為斷電(例如當機、電池故障)而造成的不完整寫入,即使當下沒有造成傷害,在日後也依然會是隱憂。

在flash memory晶片的寫入上,還有一個過去傳統硬碟不會有的問題。傳統硬碟資料只要寫進碟片上,只要不要碰到什麼大地震導致磁頭磨損碟片之類的事故,都還算安全。偏偏目前高容量SSD所使用的MLC晶片,為了效能的考量,每個電晶體都會儲存兩個先後寫入順序不同的pages的資料。所以,即使先前的資料是完整寫入的,後面要是發生斷電一類的事故,早先儲存的資料一樣會消失殆盡。若是先前儲存的資料是十分重要的資料,例如檔案分布的對應表、系統的重要檔案,那麼就可能會發生整顆SSD都無法使用、無法進入系統的慘劇。但是由於SSD為了方便作業系統,都假裝自己是個傳統硬碟,作業系統也天真地以為任何資料只要完整地寫入了硬碟,都是安全的,所以斷電後SSD資料全毀的慘劇只能一再地發生。

我們的實驗裡,最後也發現即使對於清除block這個動作,雖然斷電後表面上看起來好像天下太平,但是之後在該block的寫入還是一樣會有較高的錯誤率,因此,任何SSD在操作中的斷電,對於資料儲存而言都是十分危險的。Out-of-place的update機制即使行之多年,但是這種機制並非一開始就針對SSD/flash memory 設計,也未完整地考慮到flash memory/MLC本身的硬體特性,也因此製造商必須更認真地重新檢視控制晶片、內部檔案系統與寫入機制的設計,才能改善SSD的可靠性。

綜觀以上幾點,只依賴SSD當硬碟使用,只對於資料載入速度比較有幫助,但是資料儲存上的效率不見得一定會有顯著的提升,而且資料的安全性也令人擔憂。SSD不是不適合拿來放在個人電腦裡使用,只是使用SSD的時候,同時也要注意資料要常常利用傳統硬碟備份,對於像MacBook Air這類只用SSD的裝置而言,更是一定要用類似TimeMachine之類的備份軟體將SSD以及系統碟完整備份到其他的儲存裝置上,才能在效能與安全上取得平衡。

工商服務:本實驗室還有一些其他關於SSD資料刪除的安全性、下一個世代的高速SSD相關的研究,詳情請參閱本實驗室網站http://nvsl.ucsd.edu/