硬件基础:从 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'掉电保护(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 直通,系统盘不能用机械盘