高容量嵌入式儲存系統之高效能平均磨損演算法的設計與實作

轉自:

http://esslab.tw/wiki/index.php/The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem

The design and implementation of a

wear-leveling algorithm for the Linux MTD subsystem

From ESSLabWiki

Jump to: navigation, search


*************************************

高容量嵌入式儲存系統之高效能平均磨損演算法的設計與實作

執行計畫學生:吳海寧

指 導 教 授 :張立平

 

(一) 摘要

 

近年來隨著嵌入式系統的應用越來越廣泛,高容量快閃記憶體的需求隨之上升。由於快閃記憶體的結構與磁碟儲存裝置差異極大,平均磨損 (wear-leveling)成為快閃憶記體檔案系統設計的重要課題,一般的檔案系統若沒有對於這個部份多加處理,將會使得記憶體區塊消耗量不平均,間 接縮短了快閃記憶體的壽命。本專題的目標在於,設計一個有效快速的平均磨損演算法,同時不能因此造成系統額外的負擔,並且利用Linux下的JFFS2檔 案系統與MTD driver實作並且驗證我的演算法。

(二) 簡介

嵌入式系統通常被要求可以容忍惡劣的環境條件,如要能承受不穩定的電源,強烈的震動以及無法預期的使用者行為。因此就儲存系統而論,以往的 磁碟媒體並不適用。近年來由於快閃記憶體這種非揮發性,耐震,且省電的儲存媒體的快速發展,因此許多的嵌入式計算系統開始佈署大規模高容量的快閃記憶體儲 存系統。但由於快閃記憶體的特殊物理特性,如果直接將為磁碟所設計的資料結構套用在快閃記憶體上,將會導致快閃記憶體的壽命快速縮短。這個研究專題的主軸 在於,設計並實作一個適用於高容量快閃記憶體的平均磨損演算法(wear-leveling)。與以往不同的是,我的設計重點在於如何使用最少的計算資 源,如記憶體空間與處理器時間,來達成有效對大規模高容量快閃記憶體的平均磨損。此外,在實作的觀點方面,我也瞄準瞭如何將我的方法直接堆疊在既有的開放 源碼快閃記憶體檔案系統上,提供系統設計者一個快速並可靠的選擇,來加強既有的系統軟體。

圖一顯示了沒有平均磨損,有平均磨損,以及使用不好的平均磨損演算法產生的效果,縱軸代表區塊抹除的次數,橫軸的每個單位代表一個區塊,快速地讓讀者有一個概念:

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_01.jpg
(一)不使用wear-leveling時,區塊的磨損程度

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_02.jpg
(二)好的wear-leveling結果

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_03.jpg
(三)花費過多的overheads 的wear-leveling

 

圖一、平均磨損概念圖

當然我們希望最後呈現的將會是第二個圖表的結果。

(三) 研究方法與實作

平均磨損演算法

我們先將焦點聚於NAND快閃記憶體的硬體架構上。一個NAND快閃記憶體晶片,內部被劃分為許多大小相同的區塊(blocks),而區塊 內部又細分為許多大小相同的頁(page),如圖二所示。典型的『頁』與『區塊』之大小,各自是512B與16KB。其中,每一個頁後面都會有個較小的頁 備用空間(spare area),此頁備用空間的目的是為了儲存其對應頁之一些管理資訊,如ECC,邏輯位置,資料版本等等。一個頁與其頁備用空間可以各自獨立讀寫,但在抹除 時則會被一起消去。對快閃記憶體做讀寫的時候,其最小操作單位是一個頁,而每一個頁其初始狀態都是未被寫過的(我們稱之為一個free page)。當一個free page被寫入以後,這被寫上的資料就會被保存,即使是電源被關掉後,下次重新啟動時資料仍然在。一個被寫過的頁,是不能被直接重新寫入的 (overwrite),除非這個頁被抹除(erase)。而作抹除的時候,最小的處理單位是一個區塊。由於一個區塊包含了好幾個頁(若以典型的規格來 看,一個區塊可有32個頁),因此一次區塊抹除將會把多個頁上的資料同時消去。除了讀寫與抹除,快閃記憶體還有一個特殊的限制:每個區塊都有各自獨立的壽命。目前的技術下,每個區塊可容忍 100K次除動作,之後這個區塊裡面的頁就無法再進行可靠的存取動作。

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_04.jpg

圖二、NAND快閃記憶體架構示意圖

基於前述的硬體限制,garbage collection 策略是如何花費最少資料搬移(將一個區塊中,有效的資料先搬走,然後再進行抹除),來回收最多的可寫空間。另一個是,wear leveling 策略,是如何將每個區塊的磨損狀況平均化。關於wear leveling ,由於真實的存取行為中會有強量的空間區域性,因此如不做處理,將會造成冷資料與熱資料固定羣聚在特定的區塊。這會造成某些區塊被持續的抹除,而其他的區 塊卻鮮少被抹除。這樣將會使得壞掉的區塊快速出現,然後降低了快閃記憶體的整體壽命。

我們設計的平均磨損演算法試基於一個簡單的想法:如果一個區塊儲存了很多鮮少被更新或者唯讀的冷資料(cold data),那麼這個區塊將很少被 garbage collection policy挑選中並抹除。那麼,假如發現了兩個區塊,其中一個已經被磨損得很相對嚴重,另一個則鮮少被抹除,那麼我們應該將後者區塊中的冷資料 (cold data),把他移動到前者區塊。在這個動作以後,我們接著會給這兩個區塊一段『觀察期』,目的是使得之前嚴重磨損的區塊得以因為儲存了冷資料而停止被磨 損,而之前不常被抹除的區塊,則可以因為冷資料被搬走,而可以積極地參與 garbage collection。

為了實現上述的演算方法,我們首先將所有區塊任意地區分為兩個集合:hot pool and cold pool。Hot pool 中的區塊是希望拿來存 hot data,而cold pool 中的區塊是希望拿來存 cold data。我們要強調,一個區塊被放了hot data or cold data這不是我們想要控制的,反而我們會跟去一個區塊裡面放了什麼資料來調整他應該在哪個 pool 裡面。接著我們使用了兩個 priority queue來對兩個pools的區塊做排序。其中,Q Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_05.jpgQ Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_06.jpg 將 hot pool與cold pool中的區塊,各自就他們已經遭受過的總共抹除次數(erasure cycles)做一個排序。而 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_07.jpg 代表了hot pool 裡面有最大累積抹除次數的區塊。另外, Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_08.jpg 代表了cold pool 裡面有最小累積抹除次數的區塊。

我們的方法是以三個獨立的動作組成:(1) Dirty swap(DS):每當有一個區塊被抹除以後,就檢查區塊 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_09.jpg 與區塊 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_10.jpg 的抹除次數差異是否已經超過一個可以容忍的門檻值 TH。令 EC() 傳回一個區塊的抹除次數。當下列條件成立的時候:

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_11.jpg

我們就把 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_12.jpg 上面的資料先搬走,把 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_13.jpg 抹除,然後把 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_14.jpg 上面的資料都搬到 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_15.jpg 上面。到目前為只,我們的意圖是利用冷資料去停止 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_16.jpg 繼續被 garbage collection policy 挑中並抹除,而讓 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_17.jpg 能夠更積極地參與 garbage collection。接著,我們把 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_18.jpg 丟到 cold pool 裡面, Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_19.jpg 丟到 hot pool裡面。這樣做的目的是,舉例來說,因為先前的 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_20.jpg 現在被放置了冷資料,當它被丟進cold pool裡面以後,這個區塊將會被藏在 cold pool 裡面一陣子(因為它有很大的erasure cycles)。對於先前的 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_21.jpg ,也是類似,它會被藏在hot pool 裡面。這是為了給這兩個區塊一段『觀察期』,如前所述。

另外,另兩個動作,(2) Cold Pool Resize (CPR)(3) Hot Pool Resize (HPR), 則是,如果有些區塊位在不正確的 pool,就必須做適當的修正。其中,CPR是去發現在 cold pool 裡面那些常常被抹除的區塊,並把它們移到hot pool裡面:反過來 HPR 則對 hot pool 做相對的事情。這兩個步驟試為了讓我們的演算法能夠動態跟隨動態存取行為之中,空間區域性的改變。上述的演算法,我們稱之為 dual-pool algorithm[Chang]。這個演算法的示意圖,可以參考圖五。基本上,區塊會在:『成為 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_22.jpg DSin cold pool成為 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_23.jpg DSin hot pool成為 Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_24.jpg 這個迴圈中循環,達成所有區塊平均被磨損的目的。

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_25.jpg

圖三、dual-pool algorithm示意圖

我們可以發現:(a) dual-pool algorithm 每次只會看兩個 queue-head blocks 。不同於以往的演算法,如Kim and Lee’s algorithm,這些之前提出的演算方法會載每次需要 erase 的時候,去對所有區塊來做一次的加權計算,我們的dual-pool algorithm 執行起來非常之快。另外,(b) 由於我們每次只看了兩個區塊,所以我們只要保留一個小小的快取,來快取一些常常查用的區塊他們被抹除的狀況就可以了。以上兩點極好的特性,使得我們的演算方法在空間與時間,不論是理論的 complexity 方面還是實際量測出來的效能,都大幅勝出了以往的方法。

實作平臺架構

本專題的系統開發都在VMWare下的Linux完成,kernel版本是Linux Kernel 2.6.x,我們以Linux內建的JFFS2作為測試演算法效能的檔案系統。利用VMWare開發系統軟體的好處在於,當我們修改kernel程式碼 時,很容易產生無法預期的錯誤,導致整個系統當機,無法回復到原來的狀態。VMWare可以隨時將系統的狀態儲存下來,萬一系統當機就可以立即恢復到正常 的狀態。如此大大降低了開發系統程式的困擾。

演算法的實現

在討論演算法實作的詳細流程之前,讓我們先快速瀏覽一下Linux作業系統中快閃記憶體與檔案系統的架構。Linux下的快閃記憶體是由一 個MTD(Memory Technology Device)的裝置來管理,由於快閃記憶體與一般的區塊裝置(block device)並不相同,比方說區塊裝置只有讀寫動作,並沒有快閃記憶體特有的抹除動作,因此MTD並不算是區塊裝置。一般的檔案系統透過 FTL(Flash Translation Layer)與MTD(也就是硬體裝置)將檔案系統的位址與快閃記憶體的實體位置做轉換,但也有一些檔案系統跳過FTL這一層直接與MTD溝通(例 如:JFFS、YAFFS)。

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_Shape_01.jpg

圖四、快閃記憶體與檔案系統的架構

Mtdram則是Linux底下一個用來模擬快閃記憶體的模組,只要載入這模組(module)之後,系統就好像真的接上一個快閃記憶體 一樣,自動出現一個MTD裝置,我們可以正常掛載(mount)、卸載(umount)、寫入或刪除檔案。這次專題便是利用mtdram模擬的裝置來測試 平均磨損演算法。
依據上述的平均磨損演算法,每當某個區塊被抹除之後,必須更新記憶體的抹除資訊,並且執行dual-pool algorithm,將某些區塊的資料搬移。為了避免這些搬移的動作破壞原有的檔案系統架構與驅動裝置,本專題在mtdram與JFFS2之間新增一層轉 換層,稱做mtdram2,如此一來我們便可以將平均抹除演算法實作這層當中。基本上mtdram2的架構與mtdram完全一樣,對於JFFS2來說它 只是一個MTD裝置。我們在mtdram2中維護一個對應表,將每個JFFS2的區塊對應到快閃記憶體實體位址的資訊儲存下來。每當JFFS2要對某個區 塊作檔取、寫入或抹除的動作時,JFFS2會將本來要傳給mtdram的request傳給mtdram2,從對應表中找出JFFS2的區塊所對應到的實 體區塊,再把對應的request往下傳給mtdram。圖五是本專題的系統架構圖,以圖五右半邊的示意圖來說,JFFS2的block[A]最初是指向 實體位址的block[A]與,但是經過平均磨損演算法的搬移之後,block[A]的資料其實已經被搬移到實體位址的block[S],但是對 JFFS2來說,他仍然認為這塊資料是存在block[A],因此JFFS2跟mtdram2說它要讀取block[A],mtdram2收到要求後,從 對應表中得知block[A]是對應到實體位址的block[S],然後跟mtdram說要讀取blcok[S],最後將mtdram讀取到的結果傳回去 給JFFS2。

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_26.jpg

圖五、系統架構圖

(四) 研究成果

效能評估

效率方面可以用整體所需要的抹寫次數來評估。一般來說,如果內部資料搬移動作越頻繁, 整體需求之抹寫次數就越高,如何以有限的overhead來達成演算法可達成之平整度,是一個議題。這邊我們會以跑完一定數量的 writes以後,所有區塊之抹除次數之平均來衡量。越小代表緊花費少許的額外抹寫以及資料搬移動作就可以達到該演算法所能達成的效果。有效性方面可以用 standard deviation 來評估。越小代表區塊磨損整體情形越平整,彼此之累積抹寫次數差異越小。而越快能夠將 standard deviation 收斂之演算法試比較好的。 資源使用方面可以計算複雜度以及空間複雜度來加以評估。

效能測試

我們利用mtdram模擬一塊大小為4MB的快閃憶記體,每個區塊大小為4KB,因此總共有1024個區塊。

預先產生一個大小為3200K的檔案擺在裡面當作cold data,在利用我們自己寫的script,每次寫入一個400K的小檔案到記憶體中,然後立刻將這個檔案刪除。由於我們不會更動到cold data(3200K的檔案),一再地重複寫入刪除的動作都會集中在剩下僅存800多K的空間,一旦寫入與刪除次數到達一定的程度,JFFS2就必須啟動 garbage collection的機制,並且開始進行抹除的動作,如此便能有效地模擬出hot data的情況。根據上述的測試方法,分別統計演算法在TH = 2、4、8、16以及在沒有任何平均磨損演算法情況下(將JFFS2預設的平均磨損機制關掉)的抹除次數。

根據上述方法我們得到下列結果,圖六、圖七分別為本次實驗抹除次數的平均值與標準差成長圖。

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_27.jpg

圖六、區塊抹除次數平均值的成長圖

Image:The_design_and_implementation_of_a_wear-leveling_algorithm_for_the_Linux_MTD_subsystem_28.jpg

圖七、區塊抹除次數標準差的成長圖

觀察這兩個圖表,我們得出一個很明顯的結果,在沒有加入平均抹除演算法的時候,區塊抹除次數的標準差一直上升到將近100。然而加入我們的 平均抹除演算法之後,標準差穩定地停留在10以下,不會隨著抹除次數的增加而上升。而且最重要的是,區塊的抹除次數平均值並沒有因為加入了這個演算法而大 量提高,平均值的成長曲線跟沒有平均磨損演算法的情況仍然十分類似,只是稍微提高了一些。這證明瞭我們的演算法僅僅犧牲了少部分的代價,便足以提供效益極 高的平均磨損。

  Average Standard Deviation
TH2 129.3789 1.140934
TH4 115.8838 1.84855
TH8 109.2666 3.743792
TH16 103.8906 7.422748
No Wear-leveling 99.18652 96.51492

 

圖八:不同情況下所得到的區塊抹除次數平均值與標準差

圖八是實驗結束後抹除次數平均值與標準差的詳細數值。這個表格告訴我們平均磨損演算法TH值越小,標準差就越小,代表平均磨損的效果越好, 但同時平均值會隨著上升。這是因為TH值越小,平均磨損會越積極,造成額外的負擔也跟著增加。TH值越大,就會比較少啟動平均磨損的機制,相對來說效果會 比較差。至於如何在平均磨損的效益與overhead上取得最佳的平衡,可以由系統設計者依據其需求來考量。

(五) 結論

我們所設計的wear-leveling演算法除了在有效性,效率方面有令人耳目一新的表現以外,還可以透過更改參數,來確實改變 wear-leveling的有效程度,或者,換句話說,決定應該為wear-leveling 付出多少成本。這項特點可以讓設計者在對一個嵌入式系統作整體規劃的時候,有更多樣的選擇可以發揮。在本作品的實現過程中,我們發 現,scalability也逐漸成為嵌入式軟體的一個設計考量。由於現在的嵌入式系統中的硬體正在快速進化與提昇,設計軟體的著眼點,常常已經不能假設 problem size 很小。否則,舉例來說,快閃記憶體的容量已經快速成長,很多既有的方法都已經開始遭受poor scalability 的問題了。那麼,如何處理很大的 problem size,而在空間時間方面又有好的scalability,是個很重要的課題。此外,一些嵌入式軟體開發的想法,如先行在工具支援充沛的環境實作測試, 以及如何應該將新的軟體功能利用更動程度最小的方法來實作,這些觀念都被證實了大大節省了開發的時程,這也是我們很重要的收穫。

(六) 參考文獻

[Chang] Li-Pin Chang , " On Efficient Wear-Leveling for Large-Scale Flash-Memory Storage Systems," the 22st ACM Symposium on Applied Computing (ACM SAC), 2007.


[Chiang] M.L. Chiang, R.C. Chang, "Cleaning policies in mobile computers using flash

memory," Journal of Systems and Software 48:3 pp. 213-231, 1999.

[SD] ``Secure-Digital Card Specification,"Secure-Digital Card Association.

[eNVy] M.Wu, andW. Zwaenepoel, ``eNVy: A Non-Volatile, Main Memory Storage

System, Proceedings of the 6th International Conference on Architectural Support for

Programming Languages and Operating Systems, 1994.

[FTL] Intel Corporation, ``Understanding the Flash Translation Layer(FTL) Specification.

[KimLee] H. J. Kim and S. G. Lee, ``A New Flash Memory Management for Flash Storage

System,

[NFTL] Linux MTD project and M-System, ``NAND Flash memory Translation Layer (NFTL).

[SM] SSFDC Forum, SmartMediaTM Specification, 1999.

[TOS] Li-Pin Chang and Tei-Wei Kuo, "Efficient Mangement for Large-Scale Flash-Memory

Storage Systems with Resource Conservation,"ACM Transactions on Storage, Volume 1, Issue

4, 2005.

[JFFS2] "Journaling Flash File System, Version 2,"Linux MTD project

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章