硬件基础:从 NAND 到整机选型
写放大、寿命、掉电保护,这些盘的特性会一路传导到集群指标上。
学完这节你能做到
- 解释 SSD 写放大、GC、TRIM 与稳态性能
- 看懂 DWPD、TBW 并据此估算盘的寿命
- 为存储节点搭配合理的 CPU / 内存 / 盘位 / 网卡
盘的脾气会一路传导到集群指标上
SSD 不是"更快的硬盘",它的行为模式完全不同:写入前必须先擦除,擦除的单位比写入大得多,而且能擦的次数有限。这三条决定了它的全部特性——写放大、寿命、稳态性能衰减。
不理解这些,你会遇到一堆看似灵异的现象:新盘很快用几个月变慢、压测前 30 秒飞快之后腰斩、某块盘突然只读。
NAND、FTL 与写放大
读:按 page 读 (4KB ~ 16KB)
写:按 page 写 (但只能写到已擦除的 page)
擦:按 block 擦 (几百个 page,几 MB)
矛盾就在这:要改一个 4KB 的 page,硬件层面必须擦掉整个几 MB 的 block。SSD 内部的 FTL(Flash Translation Layer)用一套间接层来回避这个代价——写新数据时找一块干净的地方写,把旧位置标记为无效,等空闲时再由垃圾回收(GC)批量整理。
写放大系数(WAF)= 实际写入闪存的量 ÷ 主机写入的量。
| 负载类型 | 典型 WAF | 说明 |
|---|---|---|
| 大块顺序写 | 接近 1 | 整块整块地写,GC 几乎不用搬数据 |
| 4K 随机写 | 3 ~ 10 | GC 要不停搬运有效数据腾出干净块 |
新盘或刚 TRIM 过的盘有大量干净块,写入不需要 GC 参与,性能非常好看。跑一段时间后干净块耗尽,GC 开始和业务抢带宽,性能掉到稳态值——有些消费级盘能掉到峰值的 1/5。
企业级盘通过预留空间(OP,over-provisioning)来抑制这个衰减,所以标称 7.68TB 的盘物理上可能有 8TB 以上的颗粒。压测必须跑够时间(至少 5 分钟,严格的做法是先写满两遍再测),否则你拿到的是一个永远达不到的数字。
寿命:DWPD 与 TBW
两个等价的指标:
DWPD (Drive Writes Per Day):每天可以把整盘写满几次,持续 5 年
TBW (Total Bytes Written):整个生命周期能写入的总量
TBW ≈ 容量 × DWPD × 365 × 保质年限
举例:7.68TB、DWPD 1、5 年质保 → TBW ≈ 7.68 × 1 × 365 × 5 ≈ 14 PB。
| 类型 | DWPD | 适用 |
|---|---|---|
| 读密集型 | 0.5 ~ 1 | 对象存储、归档、AI 训练数据集 |
| 混合型 | 3 | 通用块存储、文件系统 |
| 写密集型 | 10+ | 日志盘、WAL/DB 盘、数据库 |
估算是否够用:
每天写入量 ÷ 单盘容量 = 需要的 DWPD
一套 100TB 的集群,每天写入 30TB,3 副本 → 实际落盘 90TB/天,摊到 100TB 裸容量上约 0.9 DWPD。选 DWPD 1 的盘刚好够,但没有余量——建议按估算值的 2 倍选型,因为你算的是平均值,而写入总有峰值。
# 查看 NVMe 已用寿命
nvme smart-log /dev/nvme0n1
# Percentage Used: 23% ← 用掉 23% 寿命
# Data Units Written: ... ← 累计写入量(单位 1000 × 512 字节)
# Available Spare: 100% ← 备用块还剩多少
一批盘同时采购、同时上线、承担相同负载,它们的 Percentage Used 会非常接近。一块到寿命意味着其余的也快了。 所以每次换盘故障处理时,都应该顺手普查一遍全集群的寿命分布,提前排采购计划——而不是等它们一块接一块地坏。
# 集群级寿命普查
pdsh -w ^all 'for d in /dev/nvme*n1; do echo -n "$d "; nvme smart-log $d | grep -i "percentage used"; done'四类 SSD:颗粒决定了它该放在哪一层
DWPD 不是可以随便挑的旋钮,它由颗粒每个 cell 存几个 bit 决定。存的 bit 越多,单位容量越便宜,但可擦写次数、随机写性能、延迟一致性同步变差。所以选型的真实动作不是"选一个 DWPD",而是先确定这块盘在系统里承担什么角色,再倒推该用哪类颗粒。
以 Solidigm(原 Intel DC)系列为参照物,四类盘的分工:
| 类型 | 代表型号 | 典型容量 | DWPD | 相对 $/TB | 承担的角色 |
|---|---|---|---|---|---|
| 极致写 SLC | D7-P5810 | 800GB、1.6TB | 50 | ~10× | 全闪系统的元数据盘、写缓存、WAL |
| 混合负载 TLC | D7-P5620 | 1.6 / 3.2 / 6.4 / 12.8TB | 3 | ~2.5× | 混闪系统的元数据盘、写缓存 |
| 读密集 TLC | D7-P5520 | 960GB、1.92 / 3.84 / 7.68 / 15.36TB | 1 | ~1.8× | 数据盘主力、系统盘、本地缓存 |
| 容量型 QLC | D5-P5336 | 15.36 / 30.72 / 61.44 / 122.88TB | ~0.2(随机写) | 1× | 大容量数据盘,需系统专门适配 |
几个必须读进去的细节:
- SLC 的容量是故意小的。 800GB / 1.6TB 不是"低端型号",而是这个角色只需要装元数据和几秒钟的写缓冲。它的价值全在 50 DWPD 和微秒级、抖动极小的写延迟上——按 $/TB 算它贵得离谱,按 $/(TB×DWPD) 算它反而是最便宜的写介质。
- QLC 的 DWPD 要看写模式。 D5-P5336 标称随机写只有 0.2 左右,但大块顺序写能到 1 附近。差别不是营销话术,而是前面讲的写放大:QLC 的 block 更大、编程步骤更多,4K 随机写的 WAF 可以到十几,顺序写接近 1。
- QLC 的随机写延迟同样很差。 不只是寿命问题——它不能作为通用块存储的数据盘直接用。
QLC 能用好的前提是:上层永远不给它下发小块随机写。这需要存储系统在架构上做到写路径先落到低延迟高寿命的介质(SLC/SCM/NVRAM),在缓存里攒够一个完整的擦除块大小,再整块顺序刷到 QLC。
VastData 就是把这件事写进架构的典型:SCM/SLC 层负责所有写入与元数据,QLC 层只承接大块顺序落盘,因此敢用 QLC 做主容量。
反过来,你把 QLC 直接塞进 Ceph 当 OSD 数据盘,客户端的 4K 随机写会原封不动打到颗粒上——性能掉到不可用,寿命几个月就烧完。
各存储系统实际怎么配
| 系统 | 元数据 / 写缓存层 | 数据层 | 为什么这么配 |
|---|---|---|---|
| VastData | SLC(如 D7-P5810)/ SCM | QLC(D5-P5336) | DASE 架构把写与元数据全部收敛到 SLC 层,攒成大块再顺序刷 QLC,所以能用最便宜的颗粒做主容量 |
| XSKY XEOS(混闪) | 混合负载 TLC(如 D7-P5620) | HDD | 对象存储的数据层用机械盘做容量,元数据与写缓存放 TLC SSD 顶住随机 I/O |
| Ceph | 读密集 TLC(WAL/DB 可上混合负载 TLC) | 读密集 TLC / HDD | OSD 直面客户端随机写,介质必须能承受随机负载;WAL/DB 分离时那块盘要按写密集选 |
| GPFS ECE | — (元数据/数据同池) | 读密集 TLC | ECE 用 NVMe 全闪同池承载元数据与数据,靠 EC 与分布抹平热点,选读密集档即可 |
| Weka | —(同池,元数据分布在所有盘) | 读密集 TLC | 同上,Weka 自己的写路径已做大块聚合,不需要单独的写缓存盘 |
问两个问题就能定档:这块盘会不会承接未经聚合的小块随机写? 会 → TLC 起步,量大且延迟敏感就上 SLC。这块盘上面有没有一层帮它把写攒成大块? 有 → 可以考虑 QLC,没有 → 绝对不要 QLC。
掉电保护(PLP):存储服务的硬性要求
SSD 内部有 DRAM 缓存。写入落到 DRAM 就返回"完成",速度很快,但如果此时断电,这部分数据就丢了。
企业级盘带 PLP(Power Loss Protection):板载电容能在掉电瞬间把 DRAM 里的数据刷进闪存。消费级盘没有。
为什么这对存储服务是硬要求?因为 Ceph、数据库这类系统大量使用 fsync()。它们的一致性承诺建立在"fsync 返回就代表数据安全"之上。用没有 PLP 的盘:
- 要么盘"诚实地"等真正落盘再返回 fsync → 延迟高到无法使用
- 要么盘"撒谎"立刻返回 → 掉电就丢数据,且文件系统可能损坏
省下的采购成本,会在第一次机房掉电时以数据损坏的形式还回来。而且这类损坏往往是静默的——不会立刻报错,只是某些对象的内容变成了旧版本,等你发现时已经无法追溯。
判断一块盘有没有 PLP:查规格书里的 "Power Loss Protection" / "Enhanced Power Loss Data Protection",或者看型号是否属于厂商的 DC / PM / Enterprise 系列。
顺带一提:GPFS ECE 的官方要求里明确写着所有被 ECE 管理的驱动器必须禁用易失性写缓存,也是同一个道理。
整机配比
把前面几节的经验值汇总成一张表,作为规划起点:
| 项 | 经验值 | 说明 |
|---|---|---|
| CPU | 每 OSD 约 1 核 | EC 池、压缩开启时要更多 |
| 内存 | 每 OSD 4 ~ 8GB | OSD 总内存 ≤ 物理内存 75% |
| 系统盘 | SATA SSD 起步,RAID1,≥ 100GB | 不能用机械盘,MON 的 RocksDB 在上面 |
| 数据盘 | 每节点 12 ~ 24 块 | 太多则单节点故障影响面大 |
| 网络 | 每节点 ≥ 2 × 25GbE | 前后端分离 |
| 单盘容量 | 7.68 ~ 15.36TB | 越大重建窗口越长 |
数据盘不要走 RAID 卡的 RAID 模式。Ceph 和 GPFS 都要求直接看到裸设备(JBOD / HBA 直通 / IT 模式),理由:
- RAID 卡的缓存和重建逻辑会与上层的冗余机制打架
- SMART 信息可能被 RAID 卡屏蔽,你看不到盘的真实健康状态
- 盘的顺序和标识可能被重排,换盘时难以定位物理槽位
买机器时就要确认 HBA 支持直通,事后改往往要停机刷固件。
一套集群每天写入 40TB 数据,3 副本,共 200TB 裸容量。选盘时至少需要多少 DWPD?
下面哪些做法会给存储集群埋下隐患?(多选)
压测一块新 NVMe,前 30 秒 6 GB/s,5 分钟后掉到 2.2 GB/s。这说明什么?
这节课的落点
- SSD 的擦除单位远大于写入单位,由此产生写放大、GC 与稳态性能衰减
- 压测必须跑到稳态,前 30 秒的数字不能用
- DWPD 按「每日落盘量 ÷ 裸容量」估算,再留 2 倍余量
- 同批次盘一起老化,换盘时顺手做全集群寿命普查
- 无 PLP 的盘不能用于存储服务,这是硬性要求不是优化项
- 数据盘必须 HBA 直通,系统盘不能用机械盘