第 44 章 基于闪存的固态硬盘

固态硬盘 (SSD) 没有机械部件,由晶体管构建,断电后仍能保存数据。我们主要关注 NAND 闪存,其具有独特性质:写入前必须擦除较大的块,且频繁擦除会导致磨损。

存储单比特

闪存芯片通过晶体管中捕获的电荷水平来编码数据。

  • SLC (Single-Level Cell):单层单元,每个晶体管存储 1 bit (0 或 1)。性能高,价格昂贵。
  • MLC (Multi-Level Cell):多层单元,存储 2 bit (00, 01, 10, 11)。
  • TLC (Triple-Level Cell):三层单元,存储 3 bit。

从比特到存储库

闪存芯片组织为存储库 (Bank) 或平面 (Plane),包含大量单元。

访问单位分为两种:

  • 块 (Block):擦除块,通常为 128 KB 或 256 KB。包含多个页。
  • 页 (Page):通常为几 KB (如 4 KB)。

写入块内的页之前,必须先擦除整个块。

闪存基本操作

闪存芯片支持三种底层操作:

  • 读 (Read):读取任意页,速度快 (约 10 微秒),支持随机访问。
  • 擦除 (Erase):写入前必须擦除整个块,将所有位设为 1。耗时较长 (几毫秒)。擦除前需将有用数据移动到他处。
  • 编程 (Program):擦除后,将页中的某些 1 改为 0。耗时约 100 微秒。

页的状态转换:

  • INVALID:初始状态。
  • ERASED:擦除块后,页内容重置并可编程。
  • VALID:编程后,页内容已设置且可读。再次修改必须擦除整个块。

性能与可靠性

读取延迟低,编程延迟较高且随每个单元的比特数增加而增加。擦除成本最高。

主要可靠性问题:

  • 磨损 (Wear out):频繁擦除和编程会导致电荷积累,最终无法区分 0 和 1。MLC 寿命约为 10,000 次 P/E (Program/Erase) 循环,SLC 约为 100,000 次。
  • 干扰 (Disturbance):访问某页可能导致相邻页的位翻转 (读干扰或编程干扰)。

从裸闪存到固态硬盘

SSD 内部包含闪存芯片、易失性内存 (用于缓存和映射表) 以及控制逻辑。

闪存转换层 (FTL, Flash Translation Layer) 将客户端的逻辑块读写请求转换为底层的读、擦除和编程命令。

FTL 的目标是提高性能和可靠性:

  • 减少写放大 (Write Amplification):FTL 发出的总写入字节数与客户端发出的总写入字节数之比。
  • 磨损均衡 (Wear Leveling):将写入均匀分布在所有块上,确保设备寿命。
  • 顺序编程:从低页到高页顺序编程,以减少编程干扰。

糟糕的直接映射

直接映射 (Direct Mapped):逻辑页 直接映射到物理页

每次写入逻辑页 时,FTL 必须读取整个物理块,擦除该块,然后编程旧页和新页。这会导致严重的写放大和极差的写入性能,且无法进行磨损均衡,容易导致热点块快速损坏。

日志结构映射

现代 FTL 多采用日志结构 (Log-Structured)。写入逻辑块时,设备将其追加到当前正在写入的块的下一个空闲页中。

设备在内存中维护一个映射表 (Mapping Table),记录每个逻辑块的物理地址。读取时通过映射表查找物理页。

这种方法避免了每次写入时的擦除操作,提高了性能,并允许 FTL 将写入分布到所有页上,实现磨损均衡。

垃圾回收

日志结构会导致覆盖写产生垃圾 (Garbage)(即旧版本的数据)。设备必须定期进行垃圾回收 (GC) 以释放空间。

GC 过程:

  1. 找到包含垃圾页的块。
  2. 读取该块中的活动页 (Live pages)。
  3. 将活动页写入日志的末尾。
  4. 擦除整个块以供后续使用。

为减少 GC 成本,SSD 通常会过度配置 (Overprovision),增加额外的闪存容量以延迟清理并在后台进行。

映射表大小

页级映射表可能非常大 (例如 1 TB SSD 需要 1 GB 内存)。

  • 基于块的映射 (Block-Based Mapping):每个块保留一个指针,减少映射信息。但小规模写入会导致大量数据复制,增加写放大。
  • 混合映射 (Hybrid Mapping):保留少量擦除过的日志块 (Log blocks),并为其保留页级映射。大部分数据使用块级映射。FTL 定期将日志块合并为数据块 (通过 Switch merge, Partial merge 或 Full merge)。
  • 页映射加缓存 (Page Mapping Plus Caching):仅在内存中缓存活跃的页级映射,减少内存需求。

磨损均衡

FTL 必须定期读取包含长期未修改数据的块,并将其重写到其他位置,使该块可用于写入。这增加了写放大,但确保了所有块的磨损率大致相同。

性能与成本比较

SSD 的随机 I/O 性能远超机械硬盘 (HDD),顺序性能也有优势。由于日志结构设计,SSD 的随机写入性能甚至优于随机读取。然而,SSD 的单位容量成本仍远高于 HDD。