Storpath
L0 存储原理全程第 3 / 38 节看完整路径
原理预计 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'

四类 SSD:颗粒决定了它该放在哪一层

DWPD 不是可以随便挑的旋钮,它由颗粒每个 cell 存几个 bit 决定。存的 bit 越多,单位容量越便宜,但可擦写次数、随机写性能、延迟一致性同步变差。所以选型的真实动作不是"选一个 DWPD",而是先确定这块盘在系统里承担什么角色,再倒推该用哪类颗粒。

以 Solidigm(原 Intel DC)系列为参照物,四类盘的分工:

类型代表型号典型容量DWPD相对 $/TB承担的角色
极致写 SLCD7-P5810800GB、1.6TB50~10×全闪系统的元数据盘、写缓存、WAL
混合负载 TLCD7-P56201.6 / 3.2 / 6.4 / 12.8TB3~2.5×混闪系统的元数据盘、写缓存
读密集 TLCD7-P5520960GB、1.92 / 3.84 / 7.68 / 15.36TB1~1.8×数据盘主力、系统盘、本地缓存
容量型 QLCD5-P533615.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 不是「更便宜的 TLC」,它需要上层系统配合

QLC 能用好的前提是:上层永远不给它下发小块随机写。这需要存储系统在架构上做到写路径先落到低延迟高寿命的介质(SLC/SCM/NVRAM),在缓存里攒够一个完整的擦除块大小,再整块顺序刷到 QLC。

VastData 就是把这件事写进架构的典型:SCM/SLC 层负责所有写入与元数据,QLC 层只承接大块顺序落盘,因此敢用 QLC 做主容量。

反过来,你把 QLC 直接塞进 Ceph 当 OSD 数据盘,客户端的 4K 随机写会原封不动打到颗粒上——性能掉到不可用,寿命几个月就烧完。

各存储系统实际怎么配

系统元数据 / 写缓存层数据层为什么这么配
VastDataSLC(如 D7-P5810)/ SCMQLC(D5-P5336)DASE 架构把写与元数据全部收敛到 SLC 层,攒成大块再顺序刷 QLC,所以能用最便宜的颗粒做主容量
XSKY XEOS(混闪)混合负载 TLC(如 D7-P5620)HDD对象存储的数据层用机械盘做容量,元数据与写缓存放 TLC SSD 顶住随机 I/O
Ceph读密集 TLC(WAL/DB 可上混合负载 TLC)读密集 TLC / HDDOSD 直面客户端随机写,介质必须能承受随机负载;WAL/DB 分离时那块盘要按写密集选
GPFS ECE— (元数据/数据同池)读密集 TLCECE 用 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 ~ 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 支持直通,事后改往往要停机刷固件。

Checkpoint单选

一套集群每天写入 40TB 数据,3 副本,共 200TB 裸容量。选盘时至少需要多少 DWPD?

Checkpoint多选

下面哪些做法会给存储集群埋下隐患?(多选)

Checkpoint单选

压测一块新 NVMe,前 30 秒 6 GB/s,5 分钟后掉到 2.2 GB/s。这说明什么?

这节课的落点

  • SSD 的擦除单位远大于写入单位,由此产生写放大、GC 与稳态性能衰减
  • 压测必须跑到稳态,前 30 秒的数字不能用
  • DWPD 按「每日落盘量 ÷ 裸容量」估算,再留 2 倍余量
  • 同批次盘一起老化,换盘时顺手做全集群寿命普查
  • 无 PLP 的盘不能用于存储服务,这是硬性要求不是优化项
  • 数据盘必须 HBA 直通,系统盘不能用机械盘

延伸资料