NVMe SSD的GC算法與仿真原理解析

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技術文章二維碼

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章