Nonvolatile Memory (NVM)
Overview
NVM 裝置(nonvolatile memory)的核心特性是斷電後仍能保留資料。一個 NVM 裝置在硬體層面由 controller 和 NAND flash die 兩部分組成,controller 負責管理所有讀寫邏輯,NAND die 才是實際儲存資料的地方。
NVM 有多種 form factor:封裝成硬碟形式的稱為 SSD,其他包括 USB drive(thumb drive、flash drive)、以 M.2 形式直接焊在主機板上的 SSD,以及手機內建儲存。高效能的 SSD 通常走 NVMe 協議透過 PCIe 連接,傳統 SATA bus 在頻寬上已逐漸成為瓶頸。
和 HDD 相比,NVM 更可靠、速度更快、沒有移動零件所以也沒有 seek time 和 rotational latency ;代價是每 MB 的成本更高、總容量較低,且壽命有限需要仔細管理。
NAND Flash 結構
Memory Cell
NAND Flash 的最小單位是 memory cell,其原理和 DRAM 類似,但關鍵差異是就算停止通電,cell 中記錄的資訊仍能維持。電子原本存在 N 區,施以高壓電後電子會穿過 P 區進入 Float Gate;Float Gate 中沒有電子記作 1,有電子記作 0。
Die Layout
NAND Flash 的儲存單位有四個層級:最小的是 page,多個 page 組成一個 block,多個 block 組成一個 plane,多個 plane 則組成一個 die。Die 是一片完整的 NAND flash 晶片,一個 SSD 裝置通常包含多個 die。
SLC, MLC, TLC, QLC
每個 cell 能儲存的位元數決定了 SSD 的規格等級:SLC 每個 cell 存 1 bit、MLC 存 2 bits、TLC 存 3 bits、QLC 存 4 bits。能容納的電子層數越多,延遲越高、壽命越短,但同樣面積能儲存的資料量也越大。
Operations
Read, Write, Erase
SSD 有三個基本操作,其單位和延遲各不相同。Read 和 Write 以 page 為單位,Erase 則必須以 block 為單位,這個不對稱是 SSD 許多設計問題的根源。
| SLC | MLC | TLC | HDD | RAM | |
|---|---|---|---|---|---|
| Read latency | 25 | 50 | 100 | 2000-7000 | 0.04-0.1 |
| Write latency | 250 | 900 | 1500 | 2000-7000 | 0.04-0.1 |
| Erase latency | 1500 | 3000 | 5000 | - | - |
從上表可以看出 SSD 遠快於 HDD 但慢於 RAM,且延遲關係是 Erase >> Write > Read;cell 能容納的層數越多,延遲越高。
Write Issue
SSD 無法直接 overwrite 已有資料的 page,必須先 erase 再 write,而 erase 是以整個 block 為單位。這意味著若只想改動一個 page 的內容,實際上必須把整個 block 讀出來、搬到新的 block 重新寫入,只在輸入中修改那個 page 的部分——這個流程非常沒效率,也是後續幾個機制存在的動機
壽命限制
每個 block 大約只能承受 100,000 次 erase 操作,超過後就會損壞
Controller Algorithms
FTL(Flash Translation Layer)
由於 SSD 無法 overwrite in place,page 被更新後舊版本就成了「已廢棄但尚未清除」的狀態,一個 block 中可能同時存在 valid 和 invalid 的 page。Controller 維護一張 FTL table,負責追蹤每個 logical block address 對應到哪個實體 page 是 valid 的,後續的 GC 和 wear leveling 都依賴這張表。
Garbage Collection
當某個 block 中有 invalid page 時,我們並不能直接 erase 那幾個 page,因為 erase 以 block 為單位。GC 的做法是:把該 block 中所有 valid page 搬到新的 block,跳過 invalid 的部分,再 erase 整個舊 block 回收空間,這樣就避免了搬移 invalid 資料的無謂開銷。
TRIM
TRIM 是 OS 通知 SSD controller「這些 page 已經不需要了」的機制,讓 controller 能提前在 FTL 中將它們標為 invalid,使後續的 GC 能更快完成。
Over-provisioning
SSD 實際上會保留一部分儲存空間不對外暴露,作為 GC 的工作緩衝區。當 GC 需要搬移 valid page 時,這塊預留空間提供了寫入的目的地,避免整個裝置都被佔滿時 GC 無法運作
Write Amplification
因為改一個 page 需要 erase 整個 block 再重寫,實際被寫入的資料量遠大於我們原本想改動的大小,這個倍率稱為 write amplification。GC 的搬移操作也會加劇 write amplification,因此降低 write amplification 是 SSD 效能優化的核心指標之一。
Wear Leveling
每個 block 的壽命有限,若讀寫集中在少數幾個 block,它們會比其他 block 提早損壞。Wear leveling 是 controller 的分配機制,讓所有 block 的寫入次數盡量均勻分佈,延長整顆 SSD 的使用壽命。