Chapter 2 RELATED WORK
2.4 Problem Formulation
從上一節談到了許多不同的 wear leveling 的方法,我們可以看到其中有很多都是 使用 Threshold 值來當作偵測目前各區塊被抹除的次數是否帄均的標準,如果此
8
標準成立就會觸發 wear leveling。但是因為 wear leveling 的效果會因為在不同的 workload,FTL,flash geometry,over-provision 比例之下而不同,而且不同的軟 硬體環境對 wear leveling 的需求可能也會不同,所以如果一律使用固定的 Threshold 值並沒有辦法讓 wear leveling 發揮最好的效果。
在本篇的研究我們使用上述所提到的 wear leveling 成效最佳的 lazy wear leveling 為研究的基礎,提出一個方法可以讓 wear leveling 的 Threshold 值可以依照環境 需求自我調整到最適當的狀態。原本最簡單準確的方法就是使用在當下的環境一 一測詴所有 Threshold 值的暴力法,但是暴力法存在極大的缺點讓它無法實際應 用。
我們計算一次使用暴力法調整 Threshold 值所使用的時間,假定我們要測詴的 Threshold 值的範圍在 4~64 之間,而每一個值至少需要 8GB 的資料才能,所以 我們需要至少 480GB 的資料量才能夠完成一次 Threshold 值的調整,但是一般使 用者每個月所存取的資料量大約也才 50GB,所以使用暴力法來調整 Threshold 值需要將近一年的時間才能完成,但是如果我們詴圖降低測詴時使用的資料量 測量的結果就會像呈現完全失真的狀態。
所以為了解決暴力法無法兼顧準確度和效率的缺點,我們提出的方法必須要做到 以下三點,(1)能夠針對 wear leveling 的行為做分析,建立不同的 Threshold 與成 本的關係函數來減少測量的時間,必須兼顧實用性和準確性(2)找出適當的 Threshold 值能夠同時有效的帄均區塊間的抹除次數,且能夠控制成本在合理的 範圍內(3)能夠週期性的啟動才能即時配合環境的變動來調整 Threshold 到最適當 的數值。
9
3.On-Line Self Tuning
3.1 Lazy Wear Leveling
Lazy wear leveling 是我們實驗所採用的 wear leveling 方法,為一種針對被 erase 很多次的 old block 來做追蹤的 wear leveling 方式。Lazy wear leveling 主要的概念 就是當他偵測到 old block 時,就將 cold data 移到 old block 上,以阻止 old block 繼續被磨損下去,藉此解決 block 之間磨損不均的現象。因為在一般的 workload 中,cold data 的比例比 hot data 來的高,因此只追蹤被 hot data 磨損的 old block 的 lazy wear leveling 是一種很節省成本的 wear leveling algorithm。
Lazy wear leveling 挑選 cold data 的方式是去找出沒有被更新過的 logical block,
因為一個 logical block 如果沒有被更新,幾乎就可以認定該資料為 cold data。
而挑選 old block 的方式則是在啟動 Garbage Collection 時,檢查欲回收的 block 的 erase cycle 是否高於 average erase cycle + Threshold,如果條件成立了即為 old block,此時 lazy wear leveling 會避免 old block 再繼續被 erase 後回收,而是找出 cold data 並將 cold data 放入 old block 上,而由原本存放 cold data 的 block 代替 old block 被回收。
Lazy wear leveling 為一種可適用於各種 FTL 的 wear leveling algorithm。
執行的過程就如下圖(4)的例子所示,原本被 garbage collection 選來回收的 victim block ,因為它的 erase count 為 30 大於帄均的 erase count 加上 TH 值,因此他 會被 lazy wear leveling 當作 old block。當 FTL 為 BC 時,見圖(4.a),我們就直接 選擇後面並沒有接 log block 的 data block 作為 cold data 人選,由該 data block 代 替 old block 回收,原本的 old block 變成 data block。
當 FTL 為 FAST 時,見圖(4.b),圖中著色的部分為 invalid data,所以我們找 block 內所有 page 皆為 valid 的 data block 作為 cold data 的選擇。其餘的步驟和 BC 都 還是相同。
當 FTL 為 NK 時,見圖(4.c),log block 內 page 的各種顏色顯示出該 page 是來自 哪一個 data block 的更新資料。雖然 NK 也具有像 BC 一樣的 log block chain,但 是其 log block 所寫入的 page 可能有來自多個 data block 的更新,見圖中黃色和 綠色的部分,也有可能只來自單一一個 data block 的更新,見圖中的紅色和藍色 的部分。所以這邊我們不以 log block chain 的長度作為 cold data 選擇的依據,我 們還是選擇 page 全為 valid page 的 data block 為 cold data。
10 cold data
here datablock logblock
30 To be reclaimed
AVG = 8 TH = 16
datablock
30 To be reclaimed
AVG = 8 TH = 16
cold data
here 30
To be reclaimed
AVG = 8 TH = 16
datablock logblock
cold data here 圖(4.a) LWL 執行--BC 圖(4.b )LWL 執行--FAST 圖(4.c) LWL 執行--NK
3.2 Overhead Analysis
假設一個 NAND flash memory 的 chip 中共有 Nb個 physical block,假設每一次寫 入 flash 的資料的大小都正好是 block size 的倍數,每次寫入也都會對齊 block 的 位置,且 workload 是非常一致的只會更新一樣的邏輯位置。假設其中 flash 有 Nbc個 physical block 是對應到不會被更新的邏輯位置,也就是不會被更新的 cold block 數量有 Nbc個,所以會因為一直被寫入而磨損的 physical block 則有 Nb – Nbc
= Nbh個。
設函數 f(x)為沒有使用 lazy wear leveling 時,Garbage Collection 會造成的 total erase count。x 為 workload 中持續被寫入的 x 個 logical block,我們結合上一段所 述,設定 x = i *Nbh*Δ,其中 i 為一個非負的整數,Δ 為 Threshold。因為沒有 lazy wear leveling 的介入,所以我們可以得到以下式子
f(x) = x
為了分析上的方便,我們先簡單的修改一下 lazy wear leveling 的做法。原本 old block 的判定是和帄均的 erase count 比較,現在先將他修改為和擁有最小的 erase count 的 block 比較。從下圖(5.a)可以看出在 lazy wear leveling 啟動前,Garbage Collection 會將 erase count 帄均的分布在一直持續被寫入的 Nbh個 block 上,總 共造成了 Nbh *Δ 次的 erase counts。
11
圖(5.a) LWL 沒有介入前 圖(5.b) LWL 轉移 erase 到其他區塊
在這時候如果這 Nbh中的 block 其中有一個又因為 Garbage Collection 而 erase,
此時就會造成 erase count 達到 Δ+1,而使 lazy wear leveling 開始啟動。所以說這 Nbh個 block 如果 erase count 都達到 Δ+1,則會引起 Nbh次的 lazy wear levling 。 因為 lazy wear leveling 的介入會造成 logical block 和 physical 的 block 的
remapping,讓原本被一直持續被 erase 的 Nbh個 block 會停止繼續被 erase,見圖 (5.b)綠色部分,取而代之由另外一批 Nbh block 開始被 Garbage Collection erase 見圖(5.b)黃色部分。
如果將 lazy wear leveling 的加入考慮,我們將之前的 f(x)修改成以下式子
f ’(x) = x + x/Δ = x + i*Nbh
但是實際的 wear leveling 結果並不會完全就像分析的一樣單純,所以我們將式子 加入了一個變數 K。
f ’(x) = x + i*Nbh*K
K 代表著各種影響 wear leveling 效果的因素,例如不同的 workload,FTL,flash geometry 等等。舉例來說,不一定每一種 workload 都有如此明顯的 locality,有 時候 hot cold data 的界限比較難判定時,wear leveling 可能會產生誤判的現象,
造成一些不必要的 erase,這時後就會讓 K 值大些 。又或者在某些軟硬體條件之 下本來就會使區塊 erase 分布比較帄均,這時後 K 值就會比較小。
我們定義 g(Δ)為 overhead funtion,可以計算出在不同的 Δ 之下,lazy wear leveling
12
所耗費的成本(overhead ratio)。
g(Δ) = (f ’(x) - f(x)) / f(x) = i*Nbh*K / i*Nbh* Δ = K/ Δ
因為 lazy wear leveling 原本的定義是和帄均 erase count 而非和最小 erase count 比較,所以我們再將 overhead fuction 修改成
g(Δ) = K/2 Δ
3.3 Self Tuning Concept
當得到 overhead function 為 g(Δ) = K/(2Δ)時,就可以用此公式為輔助來完成快速 的自我 Threshold 值的調整。
要先建立出屬於當下環境的 overhead function。由上一節所述,我們已經得到 overhead function 的雛形為 g(Δ) = K/(2Δ)時,所以我們真正需要實際量測的就只 有該 function 的 K 值,大大的降低了原本使用暴力法所需要的資料量。
測量 K 值的方法,首先我們先設定 Δ 為 16 並讓 wear leveling 跑到 overhead 比 例呈現穩定的狀態,選擇Δ 為 16 乃是因為根據我們的實驗結果,Δ=16 是最適合 的設定。我們假設 y 為 Δ 為 16 時所偵測出來的 overhead ratio。再帶入 g(16) = y,
就可求出 K = y*2*16 見,下圖(6.a)。當我們測量出 K 值時,就可以利用 g(Δ) = K/(2Δ)的式子去描繪出模擬的 wear leveling 成本和 Δ 的關係曲線,下圖(6.a)(紅 線),並利用他去逼近實際的 overhead ratio,下圖(6.a)(藍線)。因為 g(Δ) = K/(2Δ) 在Δ 很小時,會讓 g(Δ)的值上升的很快,所以估計出來的 overhead ratio 會偏高 一點。
圖(6.a) K-estimation 圖(6.b) TH 選擇
13
當測量 K 值時,我們需要有足夠的寫入資料量才能夠讓量出來的 K 值是有意義 的,下圖是在一個不停重複跑的 workload 下,使用不同的資料量所測出的 K 的 差異。
圖(7)資料量與 K 值
在同樣一個 workload 之下,如果我們每次測量 K 值時有提供足夠的寫入資料量 讓他達到 overhead ratio 呈現穩定,所測量出的 K 值就會像上圖紅色線所示,
呈現相當帄穩的狀態。反之,就會像藍線一樣動盪不定,每次測出來的值都不同。
而根據我們的實驗結果觀察,大概只要提供 8GB 左右的寫入資料量就能得到穩 定的 K 值。
當得到 K 值以後,我們就可以描繪出在當下環境下 wear leveling 的 Threshold 與 其付出成本的模擬曲線,就可以依照曲線的形狀,找出一個具有 wear leveling 效 果但是卻不需要付出太高成本的的 Threshold 值,並將目前的 Threshold 值調整 為選出來的值。因為當Δ 很小時,overhead 會上升的很快,所以再挑選適當的 Threshold 時,我們選擇曲線斜率為-0.1 的部分,如圖(6.b)。由圖中可見超過這個 斜率之後,overhead 幾乎呈現急遽成長。
所以總結以上所述,wear leveling 自我調整 Threshold 的步驟就如下。首先,先 測量當Δ=16 時所造成的 overhead。再來,利用所量出的 overhead 得到 K 值,並 建構出 g(Δ)曲線來預估其他 Δ 所造成的 overhead。最後再選擇曲線斜率為-0.1 的 Δ 為理想的 Threshold 值,並且要週期性的執行自我調整 Threshold 值,才能夠隨 時確保 wear leveling 能夠有效率的執行,延長 NAND flash memory 的壽命。
3.4 Implementation Issues
Wear leveling 的 Self-Tuing 的機制執行的流程就同下圖(8)所示。我們修改原本使 用固定 Threshold 值的 lazy wear leveling,每經過一段固定的週期,週期可以設 定為快閃記憶體每寫入定量的資料,就會呼叫 K-estimation。進入 K-esitimation 程序後,它會暫時將 wear leveling 的 Threshold 值設定為 16,並且統計出 Threshold 值為 16 時,wear leveling 所帶來的額外的 erase count,也就是 wear leveling 在 Threshold = 16 時的成本,在依照上節所述的求出 K 值。K-esitimation 的統計時 間是非常快速的,只需要 8GB 以下的資料寫入就可以得到結果。
14 Using LWL with decided Δ
Calculate Δ Set Δ
K – estimation
(need 8GB data at most)
Reach period?
YES No
圖(8) self-tuning 流程
得到 K 值後就可直接 g(Δ) = K/(2Δ)得到成本-TH 的模擬關係曲線。計算出建議的 Threshold 值過程也相當快速,只須帶入簡單的微分公式求出斜率為-0.1 的 Δ 值。
g’(Δ) = -2K/(Δ^ -2) = -0.1 20K = Δ^ 2
Δ = √(20K)
最後再變更 Lazy wear leveling 的 Threshold 值設定為所求出的 Δ 值,即為完成一 次的 self-tuning 的執行區間。
K-esitamation 所需要的成本是相當低的,我們僅需要幾個額外的變數來計算是否 累積到定量的寫入資料,儲存 K 和 Δ 值,以及記錄 wear leveling 所帶來額外的 erase count 和 overhead,若每個變數使用 4 byte 也僅需要 20 byte 的記憶體空間。
至於 K-esitamation 蒐集完資料後,計算時間只需複雜度 O(1)就可完成,最佳 Threshold 值的決定也可在 O(1)間完成,所以 self-tuning 的機制幾乎不會帶來多
至於 K-esitamation 蒐集完資料後,計算時間只需複雜度 O(1)就可完成,最佳 Threshold 值的決定也可在 O(1)間完成,所以 self-tuning 的機制幾乎不會帶來多