四、 Flash-Memory-Based File-System Benchmarks
4.3 Garbage Collection
4.3.1.3 Garbage-collection policy
由於垃圾回收的主要overhead在於回收區塊中所包含的live page數目和區塊 抹除的次數,因此垃圾回收所使用的回收策略(Garbage collection policy)的選擇就 格外的重要。在這一方面的研究, Kawaguchi and Nishioka [27]提出的方法除了 採取最基本的Greedy policy5之外,還有考量過資料冷熱影響的cost-benfit policy。
Kawaguchi and Nishioka在觀察垃圾回收的過程中發現,如果可以避免回收到存 有經常性更新的hot data的live page的區塊,就可以大大地提昇垃圾回收的效益。
主要是為了防止回收時搬移的live page的hot data,由於經常性更新的關係馬上變
成dead page,使得在垃圾回收階段的搬移動作沒有太大意義,而且需要再要求空 間存放更新後的資料,可能又觸發下一次的垃圾回收產生。因此Kawaguchi and Nishioka提出了Cost-benfit policy的回收策略,是對每個區塊中都加入一個數值,
再以這個數值作為執行垃圾回收時挑選區塊的好壞依據,好的話表示選擇回收的 區塊花費額外的負擔低且存有hot data的live page少。
4.3.2 File-System Implementations
接下來我們會依序介紹三個快閃記憶體檔案系統,是如何實作垃圾回收的功 能,簡單的介紹 3 種檔案系統,回收已寫過區塊的空間以便再使用的過程和步驟。
4.3.2.1 JFFS2
首先在 JFFS2 中會使用名為 jffs2_eraseblock 的資料結構來管理每一個區 塊,在資料結構中會將儲存於區塊上所有的 jffs2_raw_node_ref 聯成一個串列,
利用指標欄位 Frist_node 指向串列的開頭,而每個 jffs2_raw_node_ref 會指向下 一個儲存於實體位址中的 node,串列的最後指回 jffs2_eraseblock 結構中的 Last_nod。當垃圾回收發生時,JFFS2 發生時會先選定一個區塊作為 GC_block,
再將這個區塊中的 raw node 一個接著一個的檢查回收 。先利用 Gc_node 的指標 欄位指向目前選擇回收的 raw node,先檢查此 node 是否為廢棄(Obsolete)。若不 是,則搬移有效資料(valid data)到目前選擇寫入的區塊(Target block)上。反之表 示 node 上資料為無效不需要搬移,繼續跳至下一個 node 作檢查搬移的動作。(參 考圖表 15(a))重複這些回收有用 raw node 的動作,直到檢查完所有此區塊上的 raw_node 或 jffs2_eraseblock 結構中的 used_size 欄位為零,表示整個區塊中已經 沒有有效資料,再進行抹除的動作回收整個區塊空間。(參考圖表 15(b))
圖表 15. Garbage collection policy of JFFS2
由於 JFFS2 的垃圾回收是一個一個 node 回收執行的,因此若是區塊中 live raw node 數目很多的話會導致垃圾回收速度受到影響而變得緩慢。為了加快垃圾 回收的效率,JFFS2 中有 gc_thread 的機制(掛載時便會產生),會利用系統空閒時 間偷偷地進行垃圾回收的動作,或多或少能提昇一點垃圾回收的效率。而其他垃 圾回收執行的時機大都是在寫入時要求可用空間時,因此當寫入動作頻繁時,系 統無多餘的空閒時間,會導致 gc_thread 失去功用,垃圾回收都需要檔案系統自 行處理。
4.3.2.2 YAFFS
YAFFS 選擇垃圾回收的區塊的策略相當簡單。如圖表 16 所示,YAFFS 再處 理垃圾回收時,一開始先在一段選定的區間中找尋一個含有無效資料最多的區塊 (Dirtiest Block)(圖表 16 (a)),將此區塊上有用的資料頁面拷貝到另外的可用區塊 上(圖表 16 (b)),最後再對 Dirtiest block 執行抹除動作回收空間(圖表 16 (c))。之 後再從上次選擇為垃圾回收的目標區塊開始,作向後尋找 Dirtiest block 的動作。
圖表 16. Garbage collection policy of YAFFS
由於 YAFFS 選擇垃圾回收的目標區塊的策略非常簡單,而為了避免花費太 多時間再尋找 Dirtiest block,在有用區塊充足的情況下,YAFFS 會限定每次的搜 尋範圍在 200 個區塊中,所花費的時間也會有所限制。除此之外,才會對全部的 區塊作檢查,挑選出可回收最多空間的區塊。
4.3.2.3 NFTL
在NFTL中,處理垃圾回收的方式是先找出串連在RepUnitable中最長的Virtual unit chain (可參考章節 4.2.2.3.NFTL),之後逐一的將最新的資料版本搬移到目標 區塊(target block8)上,之後便執行抹除和回收串列上的其他區塊,再將EUNtable 對應到的區塊編號改成target block。(如圖表 17 所示)
8 Target block:在NFTL中選定用來存放垃圾回收時搬移資料的區塊,通常是選擇作垃圾回收的
virtual unit串列中最後一個區塊,或是另尋一個可用區塊(free block)來充當target block。
圖表 17. Garbage collection policy of NFTL
由於 NFTL 的資料排放方式(Data Placement)是利用這種串列串連的方式,而 不管串列多長,同一個串列中串連的資料都是相同的,都是表示儲存在同一個 LBA 相同位址的資料。因此再進行垃圾回收時,可以將整個串列的有效資料都 回收存放到一個區塊上,故選擇最長的串列可達到最大的空間回收效益。
4.4 Wear-Leveling
在平均抹除的這個部份,我們主要關心的還是檔案系統所造成的區塊抹除次 數的多寡,和各個區塊抹除的次數是否平均,能不能達到平均抹除的效果。
4.4.1 Performance Issues
由於在處理 Wear-leveling 的過程之中,有一個長程的目標,也就是盡可能 的讓每一塊區塊的抹除次數相近,而且額外的抹除次數不會太多,使得整體的抹 除次數只有小幅度的增加,也就是在花費最小成本的狀態下達到平均抹除的效 果。所以好的平均抹除演算法會找尋出擁有較小抹除次數的區塊來進行抹除,而 通常擁有較少抹除次數的區塊大多是儲存不常更動的 cold data 和幾乎不更動的 靜態資料。但選擇這些區塊來作為目標區塊執行抹除,獲得的空間回報率是偏低 的且額外的拷貝動作也較多。這樣和章節 4.3 中提到的垃圾回收的本質是有所牴
觸的,因為垃圾回收的策略是找尋無效資料最多的區塊,已減少搬移的資料量,
增加回收空間的效率。所以如何再這兩者互相矛盾的方法中,找到一個恰當的平 衡點,對每一個快閃記憶體檔案系統來說都是的重要議題。
4.4.2 File-System Implementations
由於在 JFFS2,YAFFS 和 NFTL 中,只有 JFFS2 有使用平均抹除的演算法。
而 YAFFS 和 NFTL 都沒有使用特別的策略去處理平均磨損。因此在之後設計實 驗的考量中,主要是針對 JFFS2 的特點來設計。
4.4.2.1 JFFS2
JFFS2 的平均抹除演算法是 99/1 法則,在每 100 次的抹除運算中,會有一次 是挑選區塊內全是 clean data 的區塊來作垃圾回收,剩餘的 99 次會機率性在部份 擁有 dirty data 的區塊內挑選,擁有較多的 dirty data 的區塊被挑選為目標區塊的 機率便越高。