SSD內部GC揭祕

SSD內部GC相關特性

P4500是一款廣泛使用的NVME SSD是DC P4500,下面的GC介紹和分析就基於P4500進行。其他款可以參考相關手冊。

P4500讀、寫、擦除、回收的粒度

P4500內部寫是按照物理page 對齊,而擦除是按照物理block對齊,最終GC操作的trim是通過NVME 協議中定義的 deallocate命令(deallocate命令,顧名思義,就是用來告訴SSD控制器哪些page/block裏的數據不需要了,
可以被SSD 控制器後續擦除。)爲此需要對這些參數有一定了解,避免由於參數不對齊導致的額外的GC代價。

P4500 Nand 相關的參數:

P4500 存儲芯片側的相關參數如下:

屬性 Size 含義
物理Page Size 16KB none
物理Block Size 24MB none
deallocate 最小Size 512B none
deallocate 最大Size 4MB none

說明:

  1. 物理Block Size的計算方法:
    page大小是16K ,一個block裏面1536個page,因此一個物理block 大小是16K * 1536 = 24MB
  2. 一次deallocate 最大、最小的計算方法:
    deallocate命令屬於NVME協議中的data management 類命令, 根據NVME 協議data management 命令的格式,可以看到表示其作用範圍的data range字段定義如下:
    SSD內部GC揭祕

可以看到:當只用一個range,且range 中length in blocks == 1的時候,表示最小的範圍即一個LBA 512B;當512個range 都用上,且每個range的length字段全都用上的
時候,可以涵蓋的範圍是512 16 512B = 4MB。

P4500 FTL 映射的粒度

P4500 控制芯片片側的相關參數如下:

P4500 FTL映射是page-level 全映射,注意這裏的page 是SSD主控芯片側FTL mapping 的最小單位,在P4500中是4KB。 每8個連續的LBA(默認每個LBA 512B)需要一個4B的FTL mapping table entry。實際使用的DC P4500 容量爲 4T, 因此需要1G個entry,佔用SSD控制器內部4GB內存。

P4500後臺的IO

下表列出了P4500內部後臺的IO任務及其頻率:

SSD內部GC揭祕

上表中標亮的部分都是需要佔用整盤物理帶寬的任務。根據從intel同事的瞭解以及實際觀測寫放大的結果來看,上表中的defrage(碎片整理)通常是影響整體性能的主要部分。
defrag 其實就是和下面要介紹的append存儲引擎的GC過程類似。

SSD內部的defragment

SS的內部做defragment的時候,是基於greedy/cost-benefit/cost-age-benefit/cost-age-Times或其他算法找到符合條件的塊,把找到的塊中有效的數據拷貝到其他地方,
直接無效掉之前找到塊對應的FTL mapping table entry, 然後更新接受有效數據的塊的FTL mapping table entry。如果這樣攢夠了一個物理block大小到空閒塊,
就可以把它erase 掉,然後把整個塊設置爲free狀態。

如下圖所示,Block x/Block y 都已經寫入了部分數據,中間由於trim或者壞page等可造成部分數據無效,此時如果空間不足,就需要做碎片整理,如下圖所示:

SSD內部GC揭祕

SSD內部的wear leveling

SSD內部需要做wear leveling是由SSD內部存儲芯片的介質決定的。SSD內部存儲芯片存儲一個bit 0的時候,需要讓電子穿透一層氧化物並且使之保持在那邊;寫1的時候,電子又會穿透氧化物會到另外一側。
如果來回這樣頻繁跳轉,會導致氧化物“變薄”,電子可能跳到非預期的一側去。 允許這樣跳轉的次數的上限,就是其對應的壽命。SSD主控芯片爲了避免整個SSD 句部由於頻繁擦寫導致提前老化,需要把寫儘量
均攤到所有的NAND空間。這就是wear leveling. 對於某塊頻繁擦寫的物理區域,會拷貝其數據到新的區域去,這會佔用整盤的帶寬。

SSD內部的Background Data Refresh

cell 可以理解是包括一個很薄的氧化層的半導體管子,是NAND上存儲數據的最小單元。通常根據其觸發transistor導通或者關閉的電壓和閾值電壓的比較,來決定齊表示的bit值。 不同於SLC一個cell只能表示0或1,MTL cell的閾值電壓可以切分成4段、8段(對應TLC)、16段乃至更多,因此一個cell可以表示多個bit位。由於losing charge (漏電)的存在,導致用默認閾值電壓可能無法讀到預期的值,這在TLC/QLC中愈發明顯。這就需要週期地讀這部分數據,或者重新寫一遍,或者把它remap到其他位置。這個過程就是refresh,顯然它也需要佔用一定的系統帶寬。特別是在由此造成的retention error 在SSD常見錯誤佔比很高的情況下,這個開銷不能忽略。

SSD內部的Read Disturb Data Relocation

在MLC SSD內部存儲芯片介質內讀一個cell的時候,會把電壓逐漸調大,直至cell對應的transistor開關導通或者關閉,然後根據此時電壓值所落在最高電壓的區間確定其所代表的值。正常情況下,這些電壓區間會劃分成幾個
閾值電壓區間。此外,還要求位於同一個bit line上的其他cell的transistor 保持turn on(bypass)狀態,這就需要給這些cell施加比較高的Vpass 電壓。而這個電壓可能觸發電子的隧道效應,導致擡高這些cell的閾值電壓,
極端情況下根據默認的閾值電壓去比較就會導致讀出錯。爲此,存儲芯片內部對於這部分閾值電壓已經偏移較大的cell上的數據,需要搬移(Relocation)。

SSD內部GC揭祕

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