SSD 控制器与 FTL —— 把 NAND 变得"像硬盘"

NAND 颗粒”反人类”——读 < 写 < 擦的粒度递增、擦写有寿命。但 OS 看到 SSD 时,它就像一个普通块设备:能随机读写、4K 对齐、不用关心擦除。这个魔术是 SSD 控制器和 FTL 完成的。

SSD 控制器的核心组件

graph TB
  subgraph SSD["SSD 内部"]
    HOST[主机接口
SATA/SAS/NVMe] CTRL[SoC 控制器
多核 ARM/RISC-V] DRAM[DRAM 缓存
映射表 + 写缓冲] SLC[SLC Cache
动态/静态] NAND[NAND 颗粒阵列
多 channel × 多 die] PLP[掉电保护
电容] end HOST --- CTRL CTRL --- DRAM CTRL --- SLC CTRL --- NAND CTRL --- PLP

主要构件:

模块 作用
主机接口 SATA/SAS/NVMe 协议处理
SoC 控制器 多核 ARM/RISC-V,运行 FTL
DRAM 缓存 存映射表(典型 1MB DRAM/1GB NAND)
NAND 通道 8-16 个独立通道,每通道挂 4-8 die
PLP 电容 企业 SSD 必备,断电保护写入
加密引擎 AES-256,硬件加速 SED

企业级 SSD 控制器主流厂商:Marvell、Phison、SMI(Silicon Motion)、Samsung 自研、海力士自研、忆联、得一微(国产)等。

FTL:Flash Translation Layer

FTL 是 SSD 里最复杂的软件——它要做几件事:

graph TB
  HOST[OS 看到的
线性 LBA 0..N] --> FTL FTL[FTL 翻译层] --> NAND[物理 NAND
Channel/Die/Plane/Block/Page] FTL -.- M[映射表] FTL -.- GC[垃圾回收] FTL -.- WL[磨损均衡] FTL -.- R[读重试 / 错误处理]

1. 地址映射(L2P Mapping)

OS 给的是逻辑块地址(LBA),但 NAND 用的是 (channel, die, plane, block, page) 这种物理坐标。FTL 维护一张 L2P 映射表 把两者关联。

映射粒度:

粒度 表大小 灵活性
Page-level(4K) 大(1TB → 1GB 表) 高(任意 LBA 任意映射)
Block-level(多 MB) 低(一个 block 整体迁移)
Hybrid 中(热数据 page 级,冷数据 block 级)

企业级 SSD 几乎全是 page-level + DRAM 映射——所以才需要那 1MB DRAM 配 1GB NAND 的比例。

DRAM-less SSD

少数低端 SSD(消费级)省掉 DRAM,用 **HMB(Host Memory Buffer,借主机内存)**或仅 SRAM。代价是性能掉、不稳定——企业级不用

2. 写入流程:Out-of-Place Update

SSD 不能”原地覆盖”——必须写到新 page 上,然后让旧 page 标记为无效:

1
2
3
4
5
6
7
8
9
原 LBA 0x1000 在物理 page A
现在要更新 LBA 0x1000:
1. 写新数据到 page B(一个空闲 page)
2. 更新 L2P:LBA 0x1000 → page B
3. page A 标记 invalid

后续多次更新:
page A,B,C,D,... 都成 invalid
block 里 invalid page 多了 → 触发 GC

这个机制是 FTL 的核心——也是写放大垃圾回收的源头。

3. 垃圾回收(GC)

graph LR
  B1[Block 1
大量 invalid page] B1 --> READ[读出仍 valid 的 page] READ --> WRITE[写到新 block] WRITE --> ERASE[擦除 Block 1] ERASE --> FREE[Block 1 加入空闲池]

GC 的代价:

  • 把 valid page 搬走 = 额外的写入
  • 这些”额外写入”占用真实带宽
  • 严重时主机看到的 IOPS 跌一半甚至更多

GC 抖动是 SSD 的常见性能问题。企业级 SSD 用复杂的策略让 GC 尽量在后台进行,不影响前台。

4. 磨损均衡(Wear Leveling)

为防止某个 block 被反复擦除而提前报废,FTL 把”擦写次数”在所有 block 间均衡:

1
2
冷数据 block:很少被改 → 强制定期搬迁,腾出 block 给热数据
热数据 block:经常被改 → 写到不同物理位置,分摊磨损

效果:所有 block 的 P/E 计数差距控制在一定范围内(典型 < 100 次差异)。

5. 读重试 + LDPC

NAND 单元随磨损会”模糊”——电压区间变窄。FTL 配合 ECC 引擎用:

  • LDPC(Low-Density Parity-Check):现代 SSD 必备的强 ECC,比 BCH 强得多
  • 读重试(Read Retry):用不同电压阈值重读,找到能解码的版本
  • RAID 内部条带(RAIN/D2):跨多个 die 做 RAID,单 die 失效可重建

新盘读 ECC 几乎没工作量;老盘临近寿命末期,每次读都在调电压重试——所以老 SSD 越来越慢。

写放大(WAF: Write Amplification Factor)

1
WAF = 实际写入 NAND 的字节 / 主机请求写的字节

理想 WAF = 1,实际不会。原因:GC、磨损均衡、metadata 写入、partial page 写都会让 NAND 上的真实写入量比主机给的多。

工作负载 典型 WAF
顺序大块写 ~1.0-1.1
随机 4K 写满 SSD 3-10
数据库 OLTP 4K 随机 2-4
视频流写入 1.0-1.2

写放大直接吃寿命:

1
2
3
4
5
TLC 颗粒 P/E = 3000
主机写入 100 TB
WAF = 4
NAND 真实写入 = 400 TB
颗粒磨损:400 / 总容量 → 接近寿命极限

这就是为什么企业级 SSD 标”DWPD”(每天满盘写次数),而不是直接标 TBW

DWPD 和 SSD 寿命分级

1
DWPD = Drive Writes Per Day(保固期内每天可写的盘容量倍数)
DWPD 等级 典型值 应用
Read Intensive 0.3-1 读多写少:分析、Web、CDN
Mixed Use 1-3 通用 / 中度 OLTP
Write Intensive 5-10+ 数据库主、缓存、日志

例:3.84 TB 企业 SSD DWPD=1,5 年保固:

1
3.84 TB × 1 DWPD × 365 × 5 = 7008 TB 写入容量(TBW)

DWPD 是企业级 SSD 选型最重要的指标之一。消费级 SSD 通常 0.1-0.3 DWPD——给数据库当主存几个月就报废。

SLC Cache:写性能”作弊”

TLC/QLC 写慢、QLC 更慢。一种常见做法:部分 NAND 临时当 SLC 用——只存 1bit/cell,写起来快得多。

1
2
3
4
5
6
对外 1TB QLC SSD
实际:900 GB QLC 区域 + 100 GB 当 SLC 缓存
新写入先进 SLC 区
→ 速度看起来很快
SLC 满了 → 后台往 QLC 区搬
→ 这时候性能崩

消费 SSD 这招用得很狠(pSLC + nCache),导致长时间持续写入的性能远低于 burst 性能。企业级 SSD SLC 缓存少或没有,性能一致性优先

掉电保护(PLP)

企业 SSD 几乎都有 Power Loss Protection——板载电容,掉电时给电几秒,让控制器把 DRAM 里的 dirty 数据 flush 到 NAND:

graph LR
  POWER[市电正常] --> CAP[电容存能量]
  POWER -- 掉电 --> DRAIN[电容供电 1-3 秒]
  DRAIN --> FLUSH[FTL 把 DRAM dirty data 写完]
  FLUSH --> SAFE[安全断电]

没 PLP 的盘掉电可能丢最近写的数据 甚至破坏 FTL 映射表 —— 整个盘报废。

消费级 SSD 通常没 PLP——这是企业和消费级最关键的区别之一。

NVMe 的 Zone Namespace(ZNS)

现代企业 SSD 有一类特殊设备:ZNS SSD

ZNS 把 SSD 分成若干 zone:

  • 每个 zone 内只能顺序写
  • zone 满了要重置(reset)
  • 没有 GC——主机自己管 zone 的回收

效果:

普通 SSD ZNS SSD
控制器 大 SoC + DRAM 映射表 简化(无 page L2P)
寿命利用 WAF 2-5 WAF ~1
性能可预测 受 GC 影响 主机控制
OS 适配 透明 需要适配(btrfs / f2fs / RocksDB)

ZNS 适合对象存储、日志类工作负载——主机软件本来就追加写。当前 ZNS 在 Western Digital、海力士的部分企业盘上有产品,主流 PaaS 还没大规模铺开

待补充:ZNS SSD 在公有云的实际部署进度。

一些可观察的内部状态

Linux 上看 SSD 状态:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 查看模型、固件、容量
sudo nvme list
sudo nvme id-ctrl /dev/nvme0

# SMART 数据:寿命、温度、写入量
sudo nvme smart-log /dev/nvme0
# percentage_used: 23% ← 寿命已用
# data_units_written: 2.5 PB ← 主机写入量
# media_errors: 0
# unsafe_shutdowns: 5

# OCP 扩展(企业 SSD 通用扩展指标)
sudo nvme ocp smart-add-log /dev/nvme0

关键指标:

  • percentage_used ≥ 80%:考虑替换
  • media_errors 突然增加:可能即将故障
  • unsafe_shutdowns 异常:检查 PLP 工作状态

控制器选型(行业现状)

主流企业 SSD 控制器:

厂商 代表方案 应用
Samsung 自研 PM9A3 / PM9D3a 三星 SSD
海力士 / Solidigm 自研 D5/D7/P5XXX SK 海力士、Solidigm SSD
Kioxia / WD 自研 CM7 / CD7 Kioxia、WD SSD
Marvell 控制器 IP 多家 OEM
Phison E26 / E36 等 多家 OEM
国产 联芸(MAXIO)、得一微、忆联、忆芯(深圳) 国产化 SSD

国产控制器在消费级 + 企业级中端已经全面起来——结合长江存储 NAND,可以做出全链路国产化 SSD。

待补充:国产控制器在企业级旗舰(数据中心 OLTP)的实际市场份额。

一张总结

graph TB
  HOST[OS 块设备
线性 LBA] --> FTL FTL[FTL 翻译] FTL --> M1[映射表
page-level] FTL --> M2[GC 后台] FTL --> M3[磨损均衡] FTL --> M4[ECC + 重试] FTL --> NAND[NAND 物理阵列] CACHE[SLC Cache] -.- FTL PLP[掉电保护] -.- FTL

小结

  • SSD 控制器 + FTL 把 NAND 的”反人类”特性藏在用户视野之外
  • L2P 映射、GC、磨损均衡、强 ECC 是 FTL 的四大核心
  • WAF 直接吃 SSD 寿命,企业 SSD 用 DWPD 标定
  • SLC Cache 让 TLC/QLC 写得快,但持久写入会”露馅”
  • 企业 SSD 必须有 PLP,消费 SSD 通常没有
  • ZNS 是更激进的方向,把 GC 责任交给主机

下一篇讲 SSD 接口——SATA / SAS / NVMe / U.2 / E1.S / E3.S。