• 沒有找到結果。

RAM-space Requirements

在文檔中 嵌入式儲存系統效能評估 (頁 50-67)

五、 Experiment Design and Experiment Result

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,而白 盒子則有兩種實驗範例。分別為範例一為經常性更新的大容量檔案(Large file with frequency small update) 和範例二非常多的小容量檔案(Many Small Files should be written or read)。下面一一說明這兩個白盒子測試實驗的目的,以及我 們準備實驗的方法。

5.2.2.1 Black-Box test

PostMark

在這裡我們選用的 Black-Box 測試是採用 Postmark 作測試,Postmark 是相 當常見用來測試檔案系統的效能評估工具,主要是模擬使用者使用網路的行為。

由於大多的嵌入式系統,如 3G 手機, PDA, Pocket PC 等大多有網頁瀏覽的功能,

所以選擇使用 Postmark 作為我們共同的黑盒子。在掛載檔案系統後,執行原始 設定的 Postmark,之後再卸載檔案系統。

5.2.2.2 White-Box test

Case.1 Large file with frequency small update

這個實驗範例只要是針對 JFFS2 所設計出來的極端行為。再分析過 JFFS2 原始碼和觀察執行的行為之後,我們發現在 JFFS2 中,在增加或變更檔案中一段 資料時,JFFS2 便會多寫入一個 raw node 去取代舊有的資料。此時 JFFS2 至少會

在主記憶體中為這個新的 raw node 多建構兩個資料結構, jffs2_raw_node_ref 和 jffs2_full_dnode ,而此時檔案為讀入狀態,為了建構 frag tree—用於判別最新的 檔案版本,又會多建構一個 jffs2_inode_frag 的資料結構 (可參考圖表 11)。因此 我們推測 JFFS2 在一個大檔案經過不斷的更新/複寫資料,會使原本大的 raw node 分裂成許多細小的 raw node。之後讀取這個碎裂成許多細小 raw node 的大檔案 時,會消耗相當龐大的記憶體空間。為了測試這個情形下消耗的記憶體空間是否 非常巨大,便設計了這個實驗。首先我們在 nandsim 上掛載測試的檔案系統 (JFFS2,YAFFS,NFTL+FAT32),之後先寫入一個大小 16MB 的檔案,再利用自定 的程式不斷對它進行 100,000 次的隨機微小更新(random small update),來達到使 大檔案碎裂的目的,在步驟完成之後在卸載測試的檔案系統,然後觀察實驗期間 檔案系統使用記憶體的數量。

Case.2 Many Small Files should be written or read

也是針對 JFFS2 所設計,理由也等同範例一中提到的,由於 JFFS2 每一個 raw node 都必須在主記憶體中建構至少兩個資料結構, jffs2_raw_node_ref 和 jffs2_full_dnode。因此隨著檔案的數量增多,消耗的記憶體空間也會隨之上升。

其中為極端的例子,也就是檔案的數量多且都為小檔案時,便可能會發生為了建 構每一個小檔案的位址轉換的關係,使得檔案系統所消耗的記憶體比檔案大小本 身還要大的情形(每一個 raw node 在記憶體中最少需要 jffs2_raw_node_ref + jffs2_full_dnode=56bytes 的空間)。我們實驗的方法是在乾淨的 nandsim 上掛載待 測的檔案系統之後,再利用之前 5.1.3.2 White-box Test 中 Case c Small size files 相同的樣本寫入到測試的檔案系統上,完成之後再卸載檔案系統,並觀察和紀錄 寫入到卸載這期間記憶體的變化。

5.2.3 Numerical Result

5.2.3.1 Black-Box test

PostMark

實驗環境是在nandsim之上,利用nandsim模擬 128MB的NAND 快閃記憶 體,並在掛載有JFFS2,YAFFS和NFTL的nandsim上執行Postmark。Postmark的參 數是採取原本的預設值,實驗結果如圖表 27 Memory consumption of Postmark所 表示。由於postmark是模擬使用者瀏覽網頁的行為,一開始會開始產生許多細小 檔案以備之後來作read/write。所以可以看到在不斷產生檔案的同時,JFFS2 由於 需要不斷建造jffs2_raw_node_ref, jffs2_full_dnode和jffs2_node_frag等 3 種資料結 構,所以不斷的消耗記憶體空間,直到程序進行到刪除後才開始慢慢的釋放出 memory空間。而YAFFS開始也是由於檔案建立的關係慢慢的增加RAM使用量,

直到process結束後,才慢慢平穩不再增加,而YAFFS由於釋放記憶體的機制較不

同於另外兩個檔案系統,會利用到一定的RAM使用量或是進行垃圾回收和卸載 (umount) 檔案系統之後,才釋放記憶體空間,所以會有上升後再平穩的曲線。

而NFTL雖然只利用了兩個固定大小的表格(只與NAND快閃記憶體大小和區塊 數量有關),但掛載FAT32 之後會在主記憶體中替每一個檔案都建造FAT的entry,

每一個entry大小約 4Kbytes,因此RAM使用的程度和JFFS2 類似,都會依照檔案 系統中管理的檔案的個數來決定使用量的多寡,因此也可以看到NFTL+FAT32 的曲線表現也是呈現出一個起伏的線條,差別在於程式執行時耗費的時間長短不 一。

Memory consumption of Postmark

0

圖表 27 Memory consumption of Postmark

5.2.3.2 White-Box test

Case.1 Large file with frequency small update

首先第一個 White-Box Way 是針對 JFFS2,因為由 Chapter 4.2.1 JFFS 中可以 得知,每一次檔案的更新都必須要在主記憶體中新增 jffs2_raw_node_ref,

jffs2_node_frag 和 jffs2_full_dnode 這三種資料結構。因此我們認為在 JFFS2 中,

當一個大型檔案頻繁地作細小的更新時的情況下,會產生出許許多多的 raw node。所以在這個實驗範例中,我們利用一個 16MB 的檔案,不斷地隨機的在檔 案中更新定量且細小資料。目的在製造原有儲存檔案的 raw node 破碎和分裂,

利用上述的方式模擬出這樣的實驗範例,來測試 JFFS2 是否會在此種情形下佔據 大量的記憶體。

實驗結果如圖表 28和圖表 29所示,可以看出隨著細小更新(Small update) 的次數增加,JFFS2 所消耗的RAM空間也就越大,表示開啟檔案時資料分散儲存 的碎裂程度越嚴重(raw node數量變多,相對應存放在RAM資料結構也多),要建 立的frag tree也就越龐大。可以看出到最後開啟這一個 16MB的檔案時,最大需 要耗費約 14MB的RAM來建立相關的位址轉換的資料結構。這是相當驚人的,尤 其在嵌入式系統的環境之下也不見得有那麼大的RAM空間可以使用,因此突顯 出JFFS2 在使用記憶體上得需求度是相當大的。在YAFFS方面,因為細小更新的

關係,每隔一段時間就必須重新先寫入object header (chunk 0)的緣故,會去一直 allocate yaffs_object的資料結構來進行寫入。隨著時間的增加,使用的記憶體也 慢慢的增加,不過整體使用的RAM空間也不到 200Kbytes,遠小於JFFS2 佔用的 記憶體。NFTL由於是使用固定的大小的兩張表格: ENUtable和RepUnitable在管 理,而底下掛載的檔案系統FAT32 中影響RAM使用量的是檔案個數。但在這個 實驗中只有一個大檔案,因此只需要在記憶體中分配一個fat_cache的entry,所以 RAM使用量不高,也不會隨著程式執行和更新資料的次數變動,維持在一個固 定的值。

Memory comsumption for a frequently change large file

0

Memory allocated (1000K bytes) JFFS2

圖表 28. Memory consumption (JFFS2)

Memory comsumption for a frequently change large file

0

Memory (K bytes)

NFTL YAFFS

圖表 29. Memory consumption (YAFFS/NFTL)

Case.2 Many Small Files should be written or read

在這個白盒子測試中,主要是要測試 JFFS2 和 YAFF 在檔案數目龐大的情形 之下,開啟和讀進所有檔案所需的記憶體空間。首先實驗範例等同於 Chapter 5.1.2.3 White-Box Tests 的 Case.3 Small size files 的樣本,我們將許多細小的小檔 案分別寫入到這三個檔案系統中,並觀察在耗費的時間中,三個檔案系統記憶體 消耗程度的過程。

在圖表 30的實驗結果中,首先JFFS2 如同我們想像地耗費大量的記憶體。

由圖表 30 明顯的看出JFFS2 會隨著時間的增加,不斷地消耗著記憶體空間,主 要原因還是那 40000 個小檔案至少也會各產生 40000 個jffs2_indoe_info,

jffs2_indoe_cache, jffs2_raw_node_ref, jffs2_node_frag和jffs2_full_dnode這 5 種資 料結構,而JFFS2 的各種資料結構是利用slab allocator預先分配的,加上一些其 他儲存在superblock上的資訊,至少也需要 20MB左右的記憶體來處理這個程序。

實驗結果也正如我們所預料的約消耗了 22MB空間。不過雖然耗費的主記憶體空 間很大,但是由於多個檔案產生的jffs2_raw_inode可以被page cache緩衝(buffer) 後,再寫入快閃記憶體上同一個頁面中的影響,讓整體的寫入次數減少,所以整 個程序執行使用的時間只有YAFFS的 1/3。

YAFFS 隨著檔案的增加,使用的記憶體使用量呈現線性成長,每加入一個 檔案都只要新增加一個 yaffs_object 和 2 個 yaffs_tnode (chunk 0 和資料),雖然也 是增加兩個資料結構,但不像 JFFS2 是使用 slab allocator 事先分配好記憶體等待 被使用,而是採取需要再 allocate 的方式。時間上由於對應程度(mapping level) 是以頁面為單位,並非像 JFFS2 寫入為 node-level 的關係(每一個檔案觸發一次 寫入),實際讀寫的速度較 JFFS2 慢上一些。

NFTL+FAT32 由於寫入的檔案個數相當龐大,對每一個寫入的檔案都需要建 立一個 fat_cache 的 entry,所以隨著讀寫檔案的個數增加,花費的記憶體也隨著 增加,但每次更新檔案都需要直接寫入到快閃記憶體中,導致整體花費的時間是 JFFS2 的 3 倍以上。(圖表 30.)

Memory consumption-Many Small Files

0

Memory allocate(1000K bytes) NFTL

YAFFS JFFS2

圖表 30. Memory consumption - Many Small Files should be written or read

綜合以上的實驗結果,在 Memory utilization 實驗的表現中可以得知,雖然 JFFS2 在處理檔案的執行動作上比較迅速,但由於使用來作位址轉換的資料結構 太多,導致會消耗掉大量的記憶體空間,消耗的記憶體空間的大小主要是和檔案 系統中儲存的 raw node 數量有關和儲存資料大小無關,例如:利用不同數量的 raw node 數去儲存同樣的資料內容,消耗的記憶體也就隨之不同。YAFFS 對於 記憶體的使用量上相當的節制,在 3 個檔案系統中表現示最亮眼的。YAFFS 使 FAT32 的檔案系統下,建構一個檔案就需要消耗一個 FAT_ENTRY (4Kbytes),所 以記憶體消耗的程度和檔案系統中的檔案個數有關,不受檔案大小影響。

5.3 Garbage Collection

5.3.1 Experimental Setup and Performance Metrics

實驗紀錄的時間是利用 Rdtsc.h 來紀錄兩個區間所花費的 cpu cycle 再換算成實際

實驗紀錄的時間是利用 Rdtsc.h 來紀錄兩個區間所花費的 cpu cycle 再換算成實際

在文檔中 嵌入式儲存系統效能評估 (頁 50-67)

相關文件