• 沒有找到結果。

三、 A Two-Level Write Buffer Management Scheme

3.2 Technical Challenge

我們會將 Two-Level Write Buffer Scheme 遇到的挑戰,分成四方面來 說明。第一節是先區分 Random Write 資料,第二節則是如何將寫入的資料有效 地分開處理,第三節則是處理 Buffer Replacement 的準則,最後則是如何將 Write Buffer 的資料寫回 NAND 快閃記憶體中。

3.2.1 Identification of Random Writes

Random Write 資料為寫入資料不往前連續寫的資料則稱之為 random,此外 不連續的資料會展現其時間區域性。Random 資料在 NFTL[1-3]的 block-level mapping 中,因為每次配置新空間仍然配置一個 block 單位,容易造成空間搶奪 的問題,讓可用空間的利用率低,抹除成本增加,所以要特別做處理。而如何能 有夠效地針對 Random Write 的資料來處理,首先就是必須先分辨出何者為 Random Write,以往的方法可以用 hash table[10]或者 LRU[11]的方法來辨認。LRU[11]

使用兩個以 Block 為單位的固定長度 LRU list,當有 write 資料時,會去更動 LRU list 裡,利用資料更新的頻繁度而得知是否為 random 資料。而 hash table[10]

則是讓每個 hash table 的 entry 有各自 Counter 值,當 write 資料寫入時,經 過 multiple hash function 後,會將 hashed 的 entry Counter 值加一,而由此 Counter 值可以得知此 Block 是否為 random 資料。

不過我們觀察到實際上將 NTFS 使用者的 Workload 做分析後,並以 Write Size

來算出各種不同 Write Size 下,它的 Random Write 的資料占總資料的比例,並 以%來表示。由圖表 5可以看出,在 Write Size 為 8 時,有 80%的資料為 Random Write,但在 Write Size 愈大時,Random Write 的比例不會超過 20%。我們可以 很確切地知道,以 Write Size 來分辨 Random Write 是可行的。

圖表 5 Write 資料中 Random Write 的比例分布圖

3.2.2 Traffic Pattern Isolation

我們將 Write Buffer 分成 Block-level Buffer 和 Page-level Buffer 兩種,而分別以 block 和 page 為管理的單位。並以兩個 Buffer 來處理不同侷限 性的資料,根據上一節將 Write 資料以 Size 來分成空間侷限性(spatial locality)以時間侷限性(temporal locality)的資料。用 Block-level Buffer 來處理空間侷限性的資料,讓資料更加 Sequential 後,才寫回 NAND 快閃記憶體 中,若直接將 sequential 資料不做處理而直接寫入 NAND 快閃記憶體中,當寫入 的資料未寫滿一個 Block 時 可以發現需要 padding 的成本,另外若 NAND 快閃記 憶 體 中 的 log block 都 為 未 寫 滿 的 資 料 , 嚴 重 的 時 候 會 造 成 log block threshing。而用 Page-level Buffer 來處理時間侷限性的資料,將 Random 資料

中。而在 Page-level Buffer 中雖以處理時間侷限性的資料為目的,但仍會有約 20%的資料是 Sequential 的資料,而佔滿 Page-level Buffer 的空間,進而推擠 了 Random 資料的空間。

再者,因為資料寫入 Page-level 或 Block-level 的 Buffer 時,為了要 維持兩邊 buffer 內資料的一致性,避免有舊的資料覆蓋到新資料的問題,在資 料要寫入到 Page-level 之前,會先去查看 Block-level 的 table 中,是否有屬 於同一個 LBA 的資料,若有的話,則會將資料寫入 Block-level 的 buffer 中,

就不會根據先前提到的準則來寫入資料。如此的做法,若兩邊的 buffer 中都存 在同一筆資料時,可以知道,在 Block-level Buffer 中的資料必定為新的資料。

3.2.3 Buffer-replacement Policy

兩個 Buffer 的 replacement 機制為了處理不同侷限性的資料,因此在 replacement 上也有不同的方式。

Block-level Buffer 在 replacement 上有二個原則來處理,第一個是當 block 中寫滿資料時,此種 block 寫回 NAND 快閃記憶體時只要做 Switch 回收即 可,因此選擇將這種 block 優先放到 LRU 的 tail,讓它能夠提前寫回 NAND 快閃 記憶體中。我們會將連續寫入資料打中的 Block 放入 LRU 的 head,讓它能夠在 buffer 中繼續寫入,當此 Block 的資料已經不再連續了,則會因為 Block LRU 的順序慢慢排到 LRU tail。另外,當 Buffer 中的空間不夠時,需要做 replacement 的時候,則會以 Block LRU 的順序來寫回 NAND 快閃記憶體中,讓連續不再繼續 發生的 block 會因為 Block LRU 的順序,被選為做 victim block。

Page-level Buffer 是以 Page LRU 的順序來做 replacement,如此可以 增加 random write 的資料停留在 Page-level Buffer 中的時間,當空間不夠需 做 replacement 時,會選擇讓久未更新的資料來寫回 NAND 快閃記憶體中。將目 前寫入的 Random 資料放至 LRU 的 head,讓它停留在 buffer 久些時間,來吸收 相同的 Random 資料,而有效減少重覆資料寫入對系統效能的損耗。

3.2.4 Flash-write Policy

寫回 NAND 快閃記憶體時,根據 Block-level 和 Page-level,而寫回 NAND 快閃記憶體中的方法也有所不同。詳細如下

在 Block-level Buffer 中,當挑選到 victim 的 block 時,會根據 block 內寫的資料量而決定寫回的 policy。當 block 內的資料量少於 block 的一半時,

例如圖表 6,有三筆資料要寫回,而每筆寫回的資料量只有 block 的1

3時。當採

用 logging 的寫回,則每次寫滿了 block 的1

3,三筆資料後,會將此 block 寫滿,

到了垃圾回收時,若此 block 被選為 victim 時,會採取 Merge 的回收,因此回 收的 cost 為 erase 兩個 block(資料區塊和此紀錄區塊),並且 copy 了六個 page 的資料。若採用 padding 的寫回方法,則每次都寫滿一個 block,做了 Switch 回收,則花費了 erase 一個 block,三筆資料的回收 cost 為 erase 三個 block。

可以得知,當寫入資料量小於 block 的1

2時,使用 padding 的方式是比 較節省 回收成本的。

圖表 6 寫回長度

1Block

< 2

反之,當寫入的資料量大於 block 的一半時,例如圖表 7所示,共寫回 三筆資料,每筆資料量為 block 的2

3時。若採用 Logging 的方式時,當寫完第一 筆資料時,block 還有1

3的空間,因此在寫第二筆資料時,會發生寫到一半就需 要做回收的情況,這時候做了 Merge 回收,共 erase 二個 block,且 copy 六個 page 的花費。而後第二筆資料繼續寫入,當第三筆資料寫完時,若此紀錄區塊 又被選為 victim 時,總共會花費 erase 四個 block,且 copy 十二個 page 的回

圖表 7 寫回長度 1 Block

≥ 2

由此可知,Block-level Buffer 在針對寫回資料量的多寡,而我們會選 擇最適宜的寫回方式,減少之後垃圾回收的成本。

而在 Page-level Buffer 中,因為 Page-level 本來就是要弱化時間侷限 性的資料,因此被挑選的 victim Page,裡面的資料即是時間侷限性較低的資料 了,因此會直接以 Logging 的方式寫回 NAND 快閃記憶體中。

而在 Page-level Buffer 中屬於同個 LBA 的 pages,未被選為 victim 的 必定是屬於時間侷限性較強的資料,本來應該讓它繼續維持在 buffer 中。但因 為寫回 NAND 快閃記憶體中的此 page,只占了紀錄區塊的一個 page,若此紀錄區 塊被選為 victim 做垃圾回收的話,成本會相當地大,只使用了一個紀錄區塊來 紀錄一個 page 的資料,相當浪費空間。因此我們會將屬於同個 LBA 的 pages 一 併寫回 NAND 快閃記憶體中。

另外,因為考慮到 Page-level 和 Block-level 的同步性,因此 victim page 在寫回時,會去檢查 Block-level 中的 table,若 Block-level 中有資料,即表 示此 victim page 的資料為舊的,所以我們會直接刪除此 page 內的舊資料。只 有當 Block-level 中沒有此 page 的資料,才表示此 page 為需要更新回 NAND 快 閃記憶體的資料。

3.2.5 Putting things together

因此,我們整個 Two-Level Write-Buffer Management 的 Scheme 會如圖 表 8所示,當有 write 資料進來我們的 Two-Level Write-Buffer 中時,為了維

持兩邊 buffer 內資料的一致性,避免有舊的資料覆蓋到新資料的問題,會先去 檢查 Block-level 中是否有同個 LBA 的資料,若有的話,會將資料直接寫入 Block-level buffer 中,否則會以資料的大小來分出空間侷限性和時間侷限性 的資料,而分別寫入 Block-level 和 Page-level 的 Buffer 中。如此的做法,若 兩邊的 buffer 中都存在同一筆資料時,可以知道,在 Block-level Buffer 中的 資料必定為新的資料。另外將資料移到 Block-level bufer 的原因是,當該 block 被寫回 NAND 快閃記憶體時將資料順便帶走。

而在 Block-level 和 Page-level 分別用 Block LRU 和 Page LRU 的 order 來做 replacement。為了兩個 buffer 的同步性,在寫回 NAND 快閃記憶體時,也 會先互相去彼此的 table 中查看是否有相同的資料存在,若有的話,因為 Block-level 裡的 buffer 一定為新的,因此會將 Page-level 內舊的資料刪除才 做寫回的動作。

另外,Page-level buffer 在寫回時,一律以 page 為單位,做 logging 的寫回。而 Block-level buffer 則依照 block 內的資料量而決定用 padding 或 logging 的寫回。

Write Buffer 的容量切分為 page-level 和 block-level buffer 的比例 也會影響到整體的效率。當 block-level buffer 比例過多,而 page-level buffer 容量較小時,此時 page-level 無法有效吸收 Random Write 資料,仍然有一部分 的資料會因 page-level buffer 的容量不夠而被擠回 NAND 快閃記憶體中,而造 成整體效率提升效果不佳。但若 page-level 比例過多,而 block-level buffer 容量較少時,將使得 Sequential Write 資料無法有效地在 block-level buffer 中排序,而 page-level 容量在一定值以上,已經能夠完全吸收 Random Write 資 料,因此過多的 page-level 容量只是浪費了使用空間。

圖表 8 Two-Level Write-Buffer Management Scheme

相關文件