NVMe SSD的GC演算法與模擬原理解析
NVMe SSD的核心演算法眾多,Garbage collection(後文簡稱GC)就是其中之一。一個好的GC演算法可以有效的降低SSD的寫放大係數,對於SSD的效能和壽命都大有益處。本篇文章就介紹下Memblaze在GC演算法及其模擬方面的一些工作。
NAND中,block必須先擦除,然後才能寫入資料,且資料寫入和擦除的粒度不一致,是需要GC的一個重要原因。擦除粒度block遠大於寫入粒度page,當系統寫入一段時間後,會存在一些block,這些block中有些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實卡環境。IO部分,目前能夠支援多種形式化描述的使用者流模式,如順序流、隨機流及其混合流;以及檔案形式的使用者資料流。檔案形式的資料流多是從實際環境中採集得到。在框架的支援下,多種演算法可以聯合研究,比如,Memblaze最近的順序流演算法,就通過和GC演算法聯合研究,以檢測其有效性。
GC演算法
GC對SSD來說,必不可少,眾多的從業人員和學者都進行了很多研究。Memblaze基於演算法模擬平臺,在GC方面也進行了大量研究。GC演算法,如上文所介紹,當沒有地方寫使用者資料的時候,把那些已經寫上資料的block,挑一些出來,這些block上有用的資料都搬到另一個新的block上,這些被挑出來的block就可以擦除,用來寫新的使用者資料了。因此,GC的核心就是怎麼挑選block。一個GC演算法需要考慮:
- 什麼時候開始做GC;
- 怎麼挑選block;
- 搬移的資料和使用者資料怎麼寫。
這些問題沒有一個確定的答案,不同的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時的模擬結果。通過對比模擬結果,可以持續調整優化演算法。
在多流的GC演算法方面,Memblaze也做了大量模擬研究,正逐步加強實踐檢驗方面的內容。更進一步,模擬平臺可以擴充套件SSD的抽象邏輯,以支援各種SSD演算法的研究。同時,GC演算法一方面也可以考慮更多的應用場景,來繼續優化演算法;同時可以考慮更新的GC演算法結構。
本文作者
來自Memblaze研究中心的技術高手。GC、磨損均衡等NVMe SSD的核心演算法和平臺模擬技術正是他的重要研究領域。這篇文章就是他執筆結合自身研究寫的一篇文章,旨在幫助讀者理解GC演算法的設計與實現的基本原理。
相關文章
- 模擬退火演算法解析演算法
- 基於 NVMe SSD 的分散式檔案儲存 UFS 效能提升技術解析分散式
- SSD結構與工作原理
- SSD NVME固態 硬碟 資料恢復硬碟資料恢復
- SSD新正規化|從SATA到NVMe(上篇)
- new&instanceof原理解析及模擬實現
- NVMe SSD新功能Reservation從入門到精通
- CMRR的模擬(原理版)
- 原理解析-過擬合與正則化
- 如何恢復SSD NVME固態硬碟的資料恢復硬碟資料恢復
- Vue響應式原理與模擬實現Vue
- 梯度下降法原理與模擬分析||系列(1)梯度
- 從StorageReview橫評看PBlaze5 PCIe NVMe SSDView
- 資料中心NVMe SSD進入PCle5.0階段
- 演算法與資料結構 1 - 模擬演算法資料結構
- 解析·玄學 模擬退火
- myvue 模擬vue核心原理Vue
- 【進階3-5期】深度解析 new 原理及模擬實現
- 《深入Java虛擬機器:JVM G1GC的演算法與實現》中的網址Java虛擬機JVMGC演算法
- Memblaze釋出NVMe SSD新品,為打造綠色資料中心而生
- 模擬C#與PLC Modbus TCP通訊,報文解析C#TCP
- LRU演算法原理解析演算法
- GC演算法介紹及工作原理和優缺點GC演算法
- .Net Core 中GC的工作原理GC
- Linux平臺下SSD的TRIM指令的最佳使用方式(不區別對待NVMe)Linux
- 【演算法】友誼與雪花的舞動,指令碼解析器原理演算法指令碼
- NVMe M.2 SSD固態硬碟選購知識 買M.2 NVME固態硬碟要注意什麼?硬碟
- Java虛擬機器:Jvm概念和原理詳解以及GC機制的分析Java虛擬機JVMGC
- JVM GC日誌解析JVMGC
- nodejs的tream(流)解析與模擬檔案讀寫流原始碼實現NodeJS原始碼
- 淺析U.2介面NVMe SSD雙埠模式(上)——應用模式與設計實現模式
- Java虛擬機器-GC垃圾回收演算法-引用計數法Java虛擬機GC演算法
- 【進階3-4期】深度解析bind原理、使用場景及模擬實現
- GC的四種清理演算法GC演算法
- JVM的四種GC演算法JVMGC演算法
- 圖解Golang的GC演算法圖解GolangGC演算法
- c++實現的模擬退火演算法C++演算法
- JVM 虛擬機器 GCJVM虛擬機GC