NVMe SSD的GC演算法與模擬原理解析

memblaze_2011發表於2018-10-15

NVMe SSD的核心演算法眾多,Garbage collection(後文簡稱GC)就是其中之一。一個好的GC演算法可以有效的降低SSD的寫放大係數,對於SSD的效能和壽命都大有益處。本篇文章就介紹下Memblaze在GC演算法及其模擬方面的一些工作。
NAND中,block必須先擦除,然後才能寫入資料,且資料寫入和擦除的粒度不一致,是需要GC的一個重要原因。擦除粒度block遠大於寫入粒度page,當系統寫入一段時間後,會存在一些block,這些block中有些page中的資料是無效的,如下圖。

GC原理示意(圖中字母標識的page包含有效資料)

對於上圖,**GC完成的功能就是把圖中左邊的兩個block選出來,然後搬移Block中的有效資料到右邊的block中。**首先,Block x和Block y上有效的資料被搬移到Block z中,然後,Block x和Block y將被擦除以便後來資料寫入。顯然這個機制作用下,SSD上NAND的寫入量要比主機寫到SSD上的資料量大(因為GC搬移資料也是NAND寫入操作)。由此就有了寫放大(WA):
寫放大計算方法
好的GC演算法能夠得到較小的WA。實現GC功能,SSD需要提供額外的儲存空間,來儲存這些需要搬移的資料,這個額外的空間就是OP(此外,當SSD出現壞塊時,OP也可以保障足夠的使用者空間)。OP越大,GC工作起來越得心應手,大開大合無拘無束,OP越小,GC越累。
這裡做一個進一步的解釋,**OP很重要,OP越大意味著使用的NAND越多,成本也越高;但是沒有OP,SSD的WA會非常大,進而影響到效能和壽命。**GC的目標就是努力使的相同OP下,WA儘可能小;或者相同WA下,OP儘可能小,這是等價的表述。隨著OP減小,SSD的效能表現會逐漸變差。

模擬平臺

GC側重在演算法研究,這需要明確輸入是什麼。困難的是,我們無法找到一個形式化的描述,或者一個資料集,來明確定義GC演算法的輸入。由此,模擬是一個解決辦法。通過建立GC演算法執行的環境,把不同的GC演算法,載入到這個環境中來執行,觀察其效果,不斷對比評估,從而得到期望的GC演算法。Memblaze開發了自己的SSD演算法模擬平臺,該平臺將SSD高度抽象,著重突出其NAND擦寫邏輯,從而簡單明瞭的直接支援GC演算法的研究。
模擬平臺由輸入、輸出、演算法和框架幾個部分組成。輸入模擬了使用者IO;輸出是監測到的系統狀態資料;演算法對GC研究來說就是GC演算法;框架是平臺核心,模擬了SSD邏輯,並將各個部分有機組合在一起協同工作,如下圖。
SSD模擬框架
框架部分可以擴充套件,以實現不同的SSD邏輯,以此來模擬各種SSD實卡環境。IO部分,目前能夠支援多種形式化描述的使用者流模式,如順序流、隨機流及其混合流;以及檔案形式的使用者資料流。檔案形式的資料流多是從實際環境中採集得到。在框架的支援下,多種演算法可以聯合研究,比如,Memblaze最近的順序流演算法,就通過和GC演算法聯合研究,以檢測其有效性。

GC演算法

GC對SSD來說,必不可少,眾多的從業人員和學者都進行了很多研究。Memblaze基於演算法模擬平臺,在GC方面也進行了大量研究。GC演算法,如上文所介紹,當沒有地方寫使用者資料的時候,把那些已經寫上資料的block,挑一些出來,這些block上有用的資料都搬到另一個新的block上,這些被挑出來的block就可以擦除,用來寫新的使用者資料了。因此,GC的核心就是怎麼挑選block。一個GC演算法需要考慮:

  1. 什麼時候開始做GC;
  2. 怎麼挑選block;
  3. 搬移的資料和使用者資料怎麼寫。
    這些問題沒有一個確定的答案,不同的SSD應用環境,不同的設計目標,會有不同的選擇。
    Memblaze研究的GC演算法,目標是在儘可能多的應用場景下,使得block的磨損基本均衡,且WA儘可能小。GC演算法包括單流、雙流以及多流演算法。這裡流指的是NAND裡選出的一串block,及其上儲存的資料。不同流的資料,基本都有明確可區分的來源。
    對於一個雙流的GC演算法來說,區分為使用者流和GC流,它們最後會寫入到不同的block中,以此來利於冷熱資料各自聚集。使用者流是直接來自host的IO構成的流,GC流是搬移產生的IO構成的流。
    GC在系統空閒容量達到閾值時啟動,並依據眾多的狀態因素和統計資訊來挑選block,最後將使用者流和GC流分別寫到不同的block裡。GC演算法好比一個程式,其中包含多個執行緒。每個執行緒都專注於分析處理各自關心的因素或資訊,並給出挑哪個block來擦除的選擇。
    一個主執行緒,根據策略來管理和選擇使用哪個執行緒提供的結果,做為最終選中的block。有一個執行緒處理磨損均衡,當各個block擦除的次數差別超過閾值時,它就提供擦除次數最小的一個block做為備選,提供給主執行緒。有一個執行緒處理冷熱資料,如果冷資料需要搬移,就把它搬到擦除次數最小的block中,以利於磨損均衡,這個block就提供給主執行緒備選。
    有一個執行緒在不斷的計算每個block的優先順序分數,並提供分數最小的那個block給主執行緒。分數的計算需要考慮很多因素,比如,block裡面有用的資料越少,分數要越低;block的擦除次數越少,分數要越低。主執行緒根據整個SSD的狀態,來確定選擇哪個block來擦除。

GC演算法的效果

下面兩個圖,分別是採用全盤隨機寫和JESD219的輸入IO時的模擬結果。通過對比模擬結果,可以持續調整優化演算法。
圖1:全盤隨機寫(橫軸是時間,主縱座標軸是寫放大WA,輔縱座標軸WL是block的擦除次數PE。Gap是最大PE和最小PE的差。下同。)

圖2:JESD219
在多流的GC演算法方面,Memblaze也做了大量模擬研究,正逐步加強實踐檢驗方面的內容。更進一步,模擬平臺可以擴充套件SSD的抽象邏輯,以支援各種SSD演算法的研究。同時,GC演算法一方面也可以考慮更多的應用場景,來繼續優化演算法;同時可以考慮更新的GC演算法結構。

本文作者

來自Memblaze研究中心的技術高手。GC、磨損均衡等NVMe SSD的核心演算法和平臺模擬技術正是他的重要研究領域。這篇文章就是他執筆結合自身研究寫的一篇文章,旨在幫助讀者理解GC演算法的設計與實現的基本原理。

Memblaze技術文章二維碼

相關文章