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 | |
这个机制是 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 | |
效果:所有 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 = 1,实际不会。原因:GC、磨损均衡、metadata 写入、partial page 写都会让 NAND 上的真实写入量比主机给的多。
| 工作负载 | 典型 WAF |
|---|---|
| 顺序大块写 | ~1.0-1.1 |
| 随机 4K 写满 SSD | 3-10 |
| 数据库 OLTP 4K 随机 | 2-4 |
| 视频流写入 | 1.0-1.2 |
写放大直接吃寿命:
1 | |
这就是为什么企业级 SSD 标”DWPD”(每天满盘写次数),而不是直接标 TBW。
DWPD 和 SSD 寿命分级
1 | |
| 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 | |
DWPD 是企业级 SSD 选型最重要的指标之一。消费级 SSD 通常 0.1-0.3 DWPD——给数据库当主存几个月就报废。
SLC Cache:写性能”作弊”
TLC/QLC 写慢、QLC 更慢。一种常见做法:部分 NAND 临时当 SLC 用——只存 1bit/cell,写起来快得多。
1 | |
消费 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 | |
关键指标:
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。