四 四
四、 、 、 、Implementation
4.1 An approximation of P(Groupi)
在章節 3.3 我們的 Buffer replacement policy 依照 Cost-Benefit Analysis 選出值最 小的 Group 成為 victim,但是由於方程式(2)中 P(Groupi)的值代表未來會 hit 的機率,
在 on-line 的 Buffer 管理中不能直接得到該值,而且在不同用途的電腦上會有不同 的 pattern,因此必需使用能隨實際 workload 而變動的方法來預測 P(Groupi),在實 際環境中我們會使用純量 Age Rank 來代替 P(Groupi)。
4.1.1 Age Transformation Function
我們會定義一個 Age Transformation Function,把 Group 的 Age(即距該 Group 上一次被寫入的 request 間隔)值代入該 Function 後得到的回傳值即為 Age Rank。
Age Rank值的範圍可以從 1 到 Levels,而 Levels 是我們設定的正整數可以從 1 到無
我們在後面的實驗中會依照每個 period 的 Group Miss 次數來動態調整 Levels,
16
目的是最小化 Group Miss 的次數。因此我們的方法介於 FAB 和 BPLRU 之間,既會 把最近被寫入的 Group 留在 Buffer 中也會留住含資料量少的 Group,而在不同的 write pattern下我們的方法可以根據統計數據來動態調整,讓 Buffer 內保留的資料 可以偏向時間區域性或者空間區域性。
4.1.2 Hit Log: Dynamically Define Age Transformation Function
要隨 write pattern 的不同來定義 Age Transformation Function,我們會使用 Hit Log(circular queue)來記錄最近 Buffer 中被 Hit 的 Group 當時的 Age 資訊,然後 再根據 Hit Log 內的記錄來定義 Age Transformation Function。如何定義參考圖 11 中的範例,圖 11(a)是 32 筆由小到大的數據,為經過排序後的 Hit Log 資料,這邊 我們設定 Levels=9,然後從 32 筆數據中按等份取出 8 份資料,接下來我們可以依 照這 8 份資料來定義 Age Transformation Function,如圖 11(b)這 8 份資料可以把 Age 區分成 9 個區段來給定 Age Rank,Age 最大的區段得到的 Age Rank 值為 1,接下來 逐漸遞增,Age 最小的區段得到的 Age Rank 值即為 Levels。
圖 11:Illustration of (a) Hit Log,(b) Age Transformation Function Age:距該 Group 上次被寫入的 request 間隔
圖 11 中有兩個參數 Hit Log Length 和 Levels 需要設定,Hit Log Length 相當於要 抓 locality 時取的 window size,設定太小會容納不下 locality,太大會導致抓到的
2 2 2 3 3 3 4 4 5 6 6 6 8 9
10 1010 11 13 19 21 24 32 324
1300 3177 4621 5409 6305 14875 16306 22373
22373 < Age
Hit Log Length = 32
324 < Age <= 5409 5409 < Age <= 22373 19 < Age <= 324 10 < Age <= 19 6 < Age <= 10 4 < Age <= 6 3 < Age <= 4 Age <= 3
Sorted data in Hit Log
Levels = 9
Age Rank = 9 Age Rank = 8 Age Rank = 7 Age Rank = 6 Age Rank = 5 Age Rank = 4 Age Rank = 3 Age Rank = 2 Age Rank = 1
Age Transromation Function
(a)
(b)
17
locality不精準,而且較大的 array size 需要較久的排序時間,在後面的實驗中我們 設定 Hit Log Length=64 可以當作參考。而 Levels 的設定在章節 4.1.1 中有說明,關 係到 Age Transformation Function 的定義,由於最多只能從 Hit Log 中取出 Hit Log Length筆資料來劃分各個 Age 區段,所以它的值不能大於 Hit Log Length+1。
4.2 Essential Data Structure
為了能夠快速搜尋 Group、加入 Group、挑選 victim,必需設計有別於 FAB 及 BPLRU的資料結構,使用單一個 LRU chain list 的資料結構並不能滿足 HitStat 的需 求。因為 HitStat 的 replacement policy 使用 Cost-Benefit Analysis 需要同時考慮每個 Group的 Age 以及 Weight,如果要計算出每個 Group 的 Cost-Benefit 值並找到值最 小的成為 victim Group 需要很大的計算量,而且隨著 Buffer size 變大 Buffer 中的 Group數量會增加,計算時間也會變長。
圖 12:Data Structure of HitStat LBA: 2
Groups contain Sectors: 5~ 6
…
Groups contain Sectors: 7~ 8 Groups contain Sectors: 9~12 Groups contain Sectors: 13~16 Groups contain Sectors: 17~24 Groups contain Sectors: 25~32 Groups contain Sectors: 33~48 Groups contain Sectors: 49~64
Group Index Table
Age Transformation Function Define
18
圖 12 是我們為 HitStat 設計的資料結構,有一張 Group Index Table 記錄 Buffer 中每一個 Group 位置的指標,搜尋時可以查詢 Group Index Table 直接找到該 Group;Hit Log 內的記錄資訊會用來定義 Age Transformation Function;另外我們會 管理數個 LRU Lists,對於每個在 Buffer 中的 Blocks Groups,我們依照 Weight(Group 包含的 Sector 數量)把它們加入相對應的 LRU List,圖中有 LRU List 2、LRU List 4、
LRU List 6 …,表示說含 Sector 數量介於 1~2 之間的 Group 都在 LRU List 2 中、含 Sector數量介於 3~4 之間的 Group 都在 LRU List 4 中…依此類推,由於我們的 Buffer 方法會留住許多含少量資料的 Group,因此我們會讓較小 Sector 數的 LRU Lists 之 間間距較小、較大 Sector 數的 LRU Lists 之間間距較大,如在 Block size=512KB 時,
我們設定 LRU List 有 2, 4, 6, 8, 12, 16, 24, 32, 48, 64, 96, 128, 192, 256, 384, 512, 768, 1024這幾種,一共 18 個 LRU List 就可以分配 weight 範圍從 1-1024 的 Groups。
每一個 Group 內都會記錄三筆資訊,LBA 記錄 Group 內的資料是屬於哪一個 Logical Block Address;Req#記錄最後一筆寫入這個 Group 的 request number;Sectors 記錄該 Group 總共包含幾個 sector 資料,可以直接做為 Weight 值。在計算某個 Group 的 Cost-Benefit 時,會先把現在的 Req Number 減掉該 Group 的 Req#得到該 Group 的 Age,再把該 Age 代入 Age Transformation Function 後可以得到 Age Rank 值,最 後用 Age Rank 除以 Group 的 Sectors 即可算出 Cost-Benefit 的值。
4.3 overhead Analysis
對我們設計的資料結構分析其搜尋、加入、挑選 victim Group 的 Time
Complexity。由於有 Group Index Table 記錄位置指標,搜尋 Group 時直接查詢該 Table 就可以直接找到 Group,搜尋 Group 的時間為 O(1);要加入或因新的寫入資料搬 移 Group 時,依照 Group 中的 Sector 值找到應該加入的 LRU List,因為是 LRU 所以 只要把 Group 加入該 list 的尾端即可,加入 Group 的時間為 O(1);而挑選 victim Group我們只需針對每個在 LRU List 最前端(List 中年紀最大)的 Groups 計算它們 Cost-Benefit的值,從這些候選的 Group 中決定哪一個成為 victim,因此挑選 victim Group的時間也只需 O(1)。
另外我們跟 BPLRU 比較 RAM space overhead,HitStat 需要額外的空間為數個 LRU List pointers、Hit Log 陣列以及每個 Group 的 Req#。假設有 17 個額外的 LRU List pointers、Hit Log 陣列大小為 64、一共有 2000 個 Groups,每一筆以 4Byte 來計算,
HitStat所耗費的 RAM space 比起 BPLRU 只多出 8KB 左右的空間。
4.4 Other Optimizations
4.4.1 Detail Replacement Policy
除了用 Cost-Benefit Analysis 來挑選 victim 外,另外有兩種 Group 應該有較高 優先權被挑選為 victim。(1)如果某個 Group 內的資料已經滿了的話,這 Block 內的 資料極有可能是 sequential write,因為 sequential 資料未來很少有機會再被寫入,
而且非常佔 Buffer 空間所以應立即被寫出。(2)我們會設定一個 Age Threshold,如 果某個 Group 的 Age 超過該值,則優先把該 Group 選為 victim 而不透過 Cost-Benefit Analysis,如此我們可以藉由 Age Threshold 決定留在 Buffer 中最久的 Group 其 Age 上限。因此 HitStat 選 victim Block 的優先順序為:1.被寫滿的 Group(sequential write);2.當 Age of Group > Age Threshold(ex: 150000),3.依 Cost-Benefit Analysis 選出值最小的 Group。
19
4.4.2 The HitStat Adjustment
圖 13:The Group characteristics of HitStat and the Padding Threshold
為了能跟 NFTL 中的 Log Block 做更好的配合,HitStat 在選擇 victim 的策略仍然 可以改進。參考圖 13,HitStat 的 replacement policy 依照 Cost-Benefit Analysis 除了 留住年輕的 Group 外也會留住未達到 Padding 條件且 Age 較大的 Group,這些 Group 屬於冷資料被更新的機會很低,即使將來能被 Hit 而使其 Weight 增長一些,但大 部份也不會達到 Padding Threshold,造成這些 Group 佔住部份 Buffer 空間很久的時 間,但最後還是要寫到 Log Block,這樣不如把這些資料早點從 Buffer flush 到 NFTL 由容量更大的 Log Block 來處理。因此我們稍微更改了 HitStat 的 replacement policy,在計算 Cost-Benefit 挑選 victim 時,會把 Weight 值小於 Padding Threshold 的 Groups 讓其 Weight 值等於 Padding Threshold 再代入 Cost-Benefit Analysis 計算,
相當於讓 Weight 在 Padding Threshold 以下的 Groups 整體為一個 LRU,調整過後的 方法我們稱為 HitStat(adj),HitStat(adj)會把圖 13 中淺灰色區域 Weight 較小且稍冷 的 Group 提早寫到 NFTL,讓 Buffer 有更多空間來留住較年輕的 Group。但當發生 Log Block Thrashing時並不適合使用 HitStat(adj),因為 flush 出 Weight 小的 Group 數量會變多,反而使 Thrashing 現象更加嚴重。在後面的實驗中,我們會在 FAST 上使用 HitStat(adj);而 BAST 則因為有 Log Block Thrashing 問題,所以還是使用原本 的 HitStat。