四、 Flash-Memory-Based File-System Benchmarks
4.3 Garbage Collection
4.4.2.2 YAFFS, NFTL
由於 YAFFS 和 NFTL 沒有採取任何平均抹除的演算法,只是單純的選擇擁 有最多無效資料的區塊來作垃圾回收動作。但在業界也稱垃圾回收為 Dynamic Wear-leveling。所謂的 Dynamic Wear-leveling,是由於垃圾回收不會去選擇儲存 靜態資料的區塊作為抹除的目標區塊,因此被挑選來作垃圾回收的區塊,大多是 儲存過一些經常變動的檔案資料,而當這些資料不斷地更新時,垃圾回收不停的 啟動下,每一次挑選的目標區塊都不會是那些內部全儲存靜態資料的區塊,而是 擁有最多無效資料的區塊。因此 Dynamic Wear-leveling 只會侷限在那些沒有儲存 靜態資料的區塊中,而儲存著靜態資料的區塊都不會被抹除和更動。
5. Experiment Design and Experiment Result
首先說明一下我們的實驗環境,我們使用Windows中的軟體VMware,創造 一台virtual machine(VM),實驗的VM使用的linux kernel 的版本是 2.6.17。然後 利用nandsim模組在主記憶體中模擬出一塊 128MB,Block size為 16Kbytes和Page size 為 512bytes 的 NAND 快 閃 記 憶 體 。 之 後 在 這 模 擬 的 NAND 上 , 掛 載 JFFS2,YAFFS 和 NFTL+FAT32 。 其 中 JFFS2 的 模 組 沒 有 開 啟 summary 和 compression的功能,而NFTL上運行的檔案系統是FAT32。詳細的實驗環境如表 格 2所表示,而實驗平台的系統架構則如所圖表 18 表示的。
表格 2.實驗環境設定
Experiment configuration (VMware+Linux-2.6.17)
NAND Flash Memory simulator (NANDsim) 128MBytes
Page size 512Bytes
Block size 16KBytes
Page read delays 25 us Page write delays 200 us Block erase delays 1.5 ms
圖表 18. 系統架構圖
5.1 Flash-Space utilization
5.1.1 Experimental Setup and Performance Metrics
在實驗的步驟上,我們先行製造出符合我們實驗範例的樣本檔案分佈,之後 在將這些樣本檔案複製到掛載有 JFFS2、YAFFS、NFTL 等等案系統的 block device 上,在將其卸載之後在利用 MTD-Until Tool 中的 nanddump 程式得到實際的 NAND 快閃記憶體的映像檔(Image),利用我們自行設計的程式去判讀分析此映 像檔。由於我們所寫入的檔案式一些擁有重複字串的二元碼(binary code),因此 很容易可以在 NAND 快閃記憶體映像檔中被判讀到,簡單的去區分出 metadata 和使用者 資料之間的差別,進而得到 NAND 快閃記憶體上得使用者資料、可用 空間、Metadata、Fragment 等等佔用空間大小的資訊。
5.1.2 Test plans:
首先我們利用幾個不同的實驗範例,分別為常態分佈(normal distribution), 大檔案(all large files),非常大檔案( all very large file) ,小檔案 (all small files)等 4
個實驗範例。其中利用 normal case 作為這裡的黑盒子測試,而另外 3 種特殊或 病態的例子,是針對特定的檔案系統去量身訂做的例子。可以讓我們瞭解到這幾 種檔案系統在這些特別的例子中的行為模式,並且可以觀察出他們的原始設計中 個別在哪些情形下表現的優劣。
5.1.2.1 Black-Box test
Normal Case (normal distribution)
Normal case為一般的檔案系統中檔案大小分佈的情形[1],詳細分佈的情況 如圖表 19所表示。在這裡使用Normal case 作為我們的黑盒子測試,是以Unix 中常見的檔案分佈為基礎,依照檔案大小所佔的檔案個數比例創造出約 2000 個
Norlmal distribution case
0
File Size (bytes)
% of total files cumulation
圖表 19.Normal case (By count) and Normal case.(use file cumulation)
5.1.2.2 White-Box test
Case.1 Large file (2KB-2MB)
Large size case 是特別設計來呈現這 3 個檔案系統在檔案尺寸都是大於頁面
Large file case
% of files cumulation
Large file case
0
圖表 20. Large file case (by count) and Large file case.(use file cumulation)
Case.2 Very Large size files
Very large file case 主要是設計來反應 YAFFS 和 NFTL 的優勢,由於這兩個 檔案系統的資料結構在大檔案和檔案數目較少的情況下會相當的有利。由於這兩 個 mapping size 較大的關係,所需要的 metadata 量較少。
我們所設計的實驗範例都為 4MB以上的file,如圖表 21所示,檔案分佈分 別為 4MBytes(3),8Mbytes(2),16Mbytes(1)。之後再將這些檔案寫到測試的快閃 記憶體檔案系統中,卸載之後分析印象檔所得。
Very Large size file
0
File size (Bytes)
Count
Very Large case
0
File size (Bytes)
% of files cumulation
圖表 21.Very Large file case(by count) and Very Large file case(use file cumulation)
Case.3 Small size files
Small size files case 是為了突顯 JFFS2 對於細小的 File 的處理會較節省空間 的優勢。在檔案數目多且檔案大小非常小(小於 page size)的情形之下,JFFS2 所 使用的近乎 node-level 的檔案對應方式,能將許多個小檔案寫入到一個頁面中,
相對於 YAFFS 和 NFTL 要將每一個檔案就佔據一個頁面的處理方式會更節省使 用到的快閃記憶體空間和減少寫入的次數。
我們製造的實驗範例的等檔案分佈,就如同圖表 22所表示的那樣,我們建 立 40000 多個細小的檔案(檔案大小介於 2bytes和 512bytes之間 ,使用的快閃記 憶體page size是 512bytes),利用這個小檔案為多數的分佈來量測,當系統中處理
的檔案大多數為細小的檔案時,各個快閃記憶體檔案系統在快閃記憶體空間使用 的情形會是如何。
Small size file case
0
File size (bytes)
Count
Small size file
0
File size (bytes)
% of file cunmulation
圖表 22.Small size file case(by count) and Small size files case(use file cumulation)
5.1.3 Numerical Result
5.1.3.1 Black-Box test
Normal Case (normal distribution)
實驗結果如下列表格 3和圖表 23所示,可以觀察出JFFS2,YAFFS和NFTL之 間各項數值都相差不遠,除了在fragment的部份。這是由於實驗環境下的頁面大 小為 512bytes,然而YAFFS中的用來儲存資料的部份是以chunk的大小 (等同於 一個page size的大小)為單位,因此在檔案的資料量小於 512bytes的情況下,資料 量無法填滿一個chunk,因此剩餘的空間變成了無法使用的fragment space。由於 這個normal case中有 23.4%的file小於等於 512bytes,所以迫使YAFFS和NFTL產 生不少的fragment。相對於YAFFS和NFTL而言,JFFS2 的儲存是利用許多個 jffs2_raw_inode和jffs2_raw_dirent去儲存,每一個raw node size會根據其後跟隨的 資料量影響而變動,但最終不會大於一個頁面的大小。因此對於細小的檔案而言 在JFFS2 的管理機制比較節省空間,不會產生過大的fragment。
JFFS2 中 fragment 產生的原因除了在 node align 所填入的 00x00 之外,還有 當區塊中最後一個 page 沒有足夠的空間去填入下一個 node 時,會採取捨去剩餘 的空間(設成 waste size),找下一個區塊來填入。所以在這個實驗範例中,相對之 下 JFFS2 產生 fragment 機會和浪費的 size 都較 YAFFS 小,所以浪費的空間也較 小。不過也由於 JFFS2 的 node 可以很細小(不見得是以 page 為單位),比較容易 產生同樣檔案散亂在不同區塊中的各處的結果,所以要用來管理紀錄 file 的 metadata 也相對的複雜,所以其所需的 metadata 的量會多一些。
在 NFTL 中由於底下掛載的系統為 FAT32 所以會有 fat table 的使用,共有約
2000 個檔案,所以 Fat table 至少要更新 2000 次以上,所以儲存 FAT TABLE 的 區塊會被不斷地串接起來。(後面會不斷看到這個策略所造成的影響,不但儲存 table 耗費固定的空間並且也是產生垃圾回收的主要原因。) 除了 FAT TABLE 的 影響之外,再加上 NFTL 和 YAFFS 相同是以 page 為單位寫入資料,所以對於那 23.4%的小檔案也會有 page size 未寫滿的 fragment 產生,因此耗費較多的可用空 間。
表格 3 The experiment result of Normal case
Normal case (file size 2Bytes~4MB) JFFS2 YAFFS NFTL Total space (Kbytes) 131072
Free space (Kbytes) 84738.5 84700.5 8279.3 Used space (Kbytes) 46333.5 46371.52 122792.7 User data (Kbytes) 45075.09 45075.09 45075.09 Metadata (Kbytes) 1241.8 1183.94 2669.95 Fragment (Kbytes) 16.6 112.5 75047.66 % of used space is user data 97.3% 97.2% 36.71%
Normal Case_NFTL
圖表 23. Result of Normal case
5.1.3.2 White-Box test
Case.1 Large File (All Large file>page size)
實驗結果如表格 4和圖表 24所示,可以看得出來在大檔案為多數時,YAFFS 由於使用的metadata object較少而有優勢,主要是每一個檔案只需要一個object
Normal case_JFFS2 0.01%
0.95%
34.39%
64.65%
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes) 34%
2%
6%
58%
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
header(Chunk 0),其他的都是儲存使用者 資料。而JFFS2 由於每一個raw node的 大小被限制不能超出一個page,所以每一個page中都會有raw node header的 overhead,所以在空間使用上略多於YAFFS2。在NFTL中由於底下掛載的系統為 FAT的影響,在必然的fat table耗費下,依舊使用了較多的實體空間來儲存相同資 料。
表格 4. The experiment result of Large file case.
Large file case size 2KB~2MB JFFS2 YAFFS NFTL Total space (Kbytes) 131072
Free space (Kbytes) 85055 85967.8 83337.3 Used space (Kbytes) 46017 45104.2 47734.7 User data (Kbytes) 45035 45032 45088 Metadata (Kbytes) 968.87 71.25 2625.11 Fragment (Kbytes) 16.13 0.94 21.6 % of used space is user data 97.87% 99.84% 94.46%
Large file case_JFFS2
0.74% 0.01%
64.89%
34.36%
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
Large file case_YAFFS
65.59%
0.05%
0.0007%
34.36% Free space (Kbytes)
User data (Kbytes) Fragment (Kbytes) Metadata (Kbytes) Large file_NFTL
2.00%
0.02%
63.58%
34.40%
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
圖表 24. Result of Large file case
Case.2 Very Large size file
實驗結果如表格 5和圖表 25所示,可以看出YAFFS在檔案size大且檔案數量 少的情形之下,metadata所佔用的空間非常少,空間利用度非常的好,近乎 100%
都可以給予使用者使用。而JFFS2 依然還是被node size給侷限著,一樣是上一個 實驗範例的原因。即使是連續儲存的大檔案依然要切割成page大小node來存放,
並在每一個page都要加入一個jffs2_raw_inode header的負擔,所以比YAFFS更耗 費一些空間再儲存metadata。NFTL由於FAT TABLE的關係,還是保持著相同的 metadata 消耗量。
表格 5 The experiment result of Very Large file case
Very large case (file size ) 2KB~2MB JFFS2 YAFFS NFTL Total space (Kbytes) 131072
Free space (Kbytes) 85033 86012.39 83385.31 Used space (Kbytes) 46039 45059.61 47686.7 User data (Kbytes) 45056 45056 45056
Large file case_JFFS2 0.74% 0.01%
64.89%
34.36%
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
Large file case_YAFFS 0.05%
Free space (Kbytes) 0.0007%
User data (Kbytes) 34.36%
Fragment (Kbytes) Metadata (Kbytes) 65.59%
Large file_NFTL
2.00% 0.02% Free space (Kbytes) User data (Kbytes) 34.40%
Metadata (Kbytes) Fragment (Kbytes)
63.58%
的fragment就大約是寫入資料量的 4 倍左右了。在metadata方面,YAFFS由於對 每一個檔案都要建立一個object header(Chunk 0)的關係,等於每一個不到一個 page SIZE的檔案,便需要使用兩個page去儲存。加上fragment的影響,所以使用 的空間至少是存入的使用者 資料兩倍以上,加上檔案數量不少(40000 多個檔 案),所以YAFFS至少要耗費 20000Kbytes來儲存metadata,因此YAFFS在small size file 大量的寫入時,空間使用率上非常差。但JFFS2 雖然表現較好,但還是由於 檔案數量太多,檔案的資料量太小(2~32Bytes),而迫使node header的大小大於 使用者資料量(jffs2_raw_indoe 和jffs2_raw_dirent分別需要 48Bytes和 52bytes),
所以導致JFFS2 空間利用度上的表現也是偏低的 38%。
表格 6 The experiment result of Small size file
Small case (file size ) 2B~512Bytes JFFS2 YAFFS NFTL Total space (Kbytes) 131072
Free space (Kbytes) 119261 86458.42 106302.3 Used space (Kbytes) 11811 44613.58 24769.703 User data (Kbytes) 4491.211 4491.211 4491.211 Metadata (Kbytes) 7278.79 24047.17 4332.15 Fragment (Kbytes) 41 16075.2 15946.34 % of used space is user data 38.03% 10.07% 18.13%
Small File Case_JFFS2
90.99%
5.55%
3.43%
0.03%
Free space (Kbytes) User data (Kbytes)
Free space (Kbytes) User data (Kbytes) Metadata (Kbytes) Fragment (Kbytes)
Small file case_YAFFS
3% 67%
綜合以上的實驗結果,在 space utilizeation 實驗的表現中可以得知,在於儲 存大容量檔案的表現上 YAFFS 表現的最為出色,但若是系統中多數的檔案大小
小於一個 page size 的話,使用 JFFS2 會比較節省空間。
5.2 RAM-space Requirements
5.2.1 Experimental Setup and Performance Metrics
實驗的步驟大致上都是執行測試的程式後,再透過我們加入的在各個檔案系 統各自的記憶體分配量計數(memory allocation count)來紀錄 log,其他像是 JFFS2 和 FAT 有使用 slab 分配器,一些需要使用的資料結構會在系統中先要求記憶體 再分割成等大小的資料結構等待被使用。計算這些在系統中實際使用到的 slab 記憶體,可以由/proc/slabinfo 得知各 slab 的大小和分配的個數,之後根據這些資 訊,再實驗的進行過程中,我們會每隔一段時間便將資訊寫入 log 中,之後再根 據 log 檔,觀察實驗進行的過程中每單位時間記憶體使用量的變化。
5.2.2 Test plans
關於記憶體使用量(RAM utilization)實驗的部份,我們依舊主要劃分為黑盒 子測試和白盒子測試兩大類。其中這裡使用的黑盒子測試是採取 Postmark,而白
關於記憶體使用量(RAM utilization)實驗的部份,我們依舊主要劃分為黑盒 子測試和白盒子測試兩大類。其中這裡使用的黑盒子測試是採取 Postmark,而白