SStorpath
原理预计 30 分钟

硬件基础:从 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 ~ 10GC 要不停搬运有效数据腾出干净块
×压测前 30 秒的数字是假的

新盘或刚 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 ~ 8GBOSD 总内存 ≤ 物理内存 75%
系统盘SATA SSD 起步,RAID1,≥ 100GB不能用机械盘,MON 的 RocksDB 在上面
数据盘每节点 12 ~ 24 块太多则单节点故障影响面大
网络每节点 ≥ 2 × 25GbE前后端分离
单盘容量7.68 ~ 15.36TB越大重建窗口越长
HBA 必须是直通模式

数据盘不要走 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 直通,系统盘不能用机械盘

延伸资料