【读读论文】大规模真实线上环境下 SSD 寿命,写放大等特性研究

Operational Characteristics of SSDs in Enterprise Storage Systems: A Large-Scale Field Study

此论文为多伦多大学与 NetApp 合作发表在 FAST’22 上的论文,统计分析了 NetApp 线上两百多万块 SSD 在过去 4 年内的运行数据,以此总结了 SSD 寿命,写放大这两个核心运维特性在大规模线上环境下的真实情况及其影响因素。

看完最大的感想是,SSD 间差异是巨大的,垃圾厂家的 SSD 真是不能用……

引言

这篇论文作为一篇统计分析类文章之所以能发表在 FAST 上的重要原因在于其统计规模巨大且广泛,而且是真实线上环境,比之前同类研究中选取某个小范围特定场景来说有价值得多。NetApp 是一家美国的云存储公司,由于其客户的多样性,其底层存储系统同时提供了 NFS,iSCSI,NVMe_oF,S3 等多种接口,因此整体的应用负载特性相对较能反映各种不同应用的平均水平,而非某种特定场景。NetApp 使用的 SSD 规模也很大,总量约 200 万块,包括 3 个厂家,20 余个系列,同时存在 SAS & NVME 接口的(以 SAS 居多),具体情况见下表:

Table 1

I,II,III 代表三家生产商,论文里面并没有披露具体是哪三家,然而根据某些型号不太常见的容量,如 I-D 的 3.8T,II-H 的 30T,可以推测出 I 是 Sandisk,II 是 Samsung,至于 III 由于只有一个 III-A 数量太少,就不知道是哪家了。上表除最后 II-X, II-Y, II-Z 为 NVME 接口外其余 SSD 均为 SAS 接口的,可以推测从数量上看 SAS SSD 也占了绝大部分。不过 SSD 的接口类型对其寿命,写放大应该是没有什么影响的,故尽管未来 NVME SSD 会越来越多,这篇论文依然会有参考价值。

上层应用从使用场景上来看可以分为两大类:

  • 作为 HDD 盘的高速缓存层使用,简称为 WBC 应用(Write-Back Cache)
  • 直接构成全 SSD 阵列,简称为 AFF 应用(All Flash Fabric-attached-storage)

这两类系统的读写特性差异较大,因此论文中基本都是将其分开进行讨论。

论文想要回答的核心问题包括:

  • 实际生产环境中的读写比例是怎样的?
  • 实际生产环境中真实的写入速率到底有多快?SSD 的寿命能有多长?未来 QLC 寿命会更短,它能满足数据中心及企业级应用的需求么?
  • 实际生产环境中的 SSD 写放大会有多严重?之前学术界的研究分析是否符合实际情况?
  • 实际生产环境中 SSD 的损耗平均做得好不好?
  • SSD 的写放大从理论上分析会和很多因素有关,那在实际生产环境中,这些因素的影响到底有多大呢?哪些因素才是主要的呢?

下面我们就跟随着作者的脚步来回答下这些问题吧。

统计数据分析结果

读写比例分析

Figure 9

  • 大部分盘读都比写多
  • AFF 应用中读写比中位数约为 3.6:1,95 分位值为 61:1
  • WBC 应用中读写比中位数约为 4.1:1,95 分位值为 150:1
  • 可以看到 WBC 应用的读写比例比 AFF 应用更高,且 95 分位值差距很大;对于 WBC 应用来说,更高的读写比是期望中的,这也就意味着更高的 Cache 使用率

Facebook,Microsoft,Alibaba 的统计数据中也是读比写多,不过 NetApp 这次公开的统计数据读写量远高于其余几家公开的统计数据:

Figure 11

应用写入速度分析

SSD 的寿命和写入量有密切关系,DWPD 这一指标就是厂家给出的推荐写入速度上限,其含义为每天可以写入 SSD 容量几倍的数据(Drive Writes Per Day),大部分企业级 SSD 的 DWPD 值为 1 或 3,部分使用 MLC 颗粒的 SSD 会更高,可达到 10 以上。未来使用 QLC 颗粒的 SSD DWPD 大概率会下降到 1 以下。那实际生产环境中 DWPD 会到多少呢?来看看数据吧。

Figure 1

  • 不同盘的 DWPD 值分布很广,且长尾比较明显。整体来看中位数只有 0.36 左右,小于目前大部分 SSD 的 DWPD 值上限;然而也有 7% 左右的 SSD DWPD 超过了 3;2% 左右的超过了 10
  • WBC 应用比 AFF 应用写入量更高,中位数 WBC 是 AFF 的 3.4 倍,99 分位值更是达到了 10.6 倍
  • WBC 应用中 DWPD 值的分布也更宽广,这也就意味着其运维会更有挑战性
  • 再来看下容量和产品型号的问题,这里其实评估的并不是容量和产品型号本身,而是负载类型的影响。由于 NetApp 会使用不同容量的和型号的 SSD 去搭建不同的产品,为不同的客户提供服务,因此型号的差异就可以视为不同应用负载的差异。可以看到不同应用负载下 DWPD 值差异也很大

以上两部分内容其实并没有太多干货。读多写少是大部分互联网业务的典型场景;不同负载的写入量差异很大也是很正常的。

NAND 使用损耗分析

SSD 除了 DWPD 外还有个重要指标是 PE Cycle Limit,即最大擦写循环次数(Program-Erase Cycle),这是决定 SSD 寿命的根本性因素,SSD 寿命预测基本就是根据当前 PE Cycle 与最大 PE Cycle Limit 的比值得出的。因此作者引入了一个年损耗率的概念:

NAND Usage Rate per Year

显而易见,此值的含义就是每年会用去 SSD 总寿命的百分比。实际统计结果如下:

Figure 2

  • 绝大部分 SSD 年损耗率其实是非常低的,AFF 应用中 60% 的 SSD 年损耗率小于 1%,也就是这部分 SSD 用 100 年才会报废
  • 尽管 WBC 应用的写入量比 AFF 应用要高不少,然而二者的年损耗率其实是差不多的,原因是 WBC 应用的写放大系数要低于 AFF 应用,这抵消了其写入量更高的影响
  • 上图中可以很明显的看到几条极为不和谐的曲线,即 I-C,I-D,I-E,I-B 这几个型号的 SSD 有着远超其他 SSD 的年损耗率,然而其写入特性并没有和其他 SSD 有明显区别。这 4 个极为垃圾的 SSD 型号都是来自 Sandisk 的,而且 Sandisk 一共也就 5 个型号……😂 造成这一现象的原因是 Sandisk 的 SSD 有着远超其他厂商 SSD 的写放大系数,这一点下面再来具体分析

根据以上数据我们可以来评估下未来 QLC 的寿命是否能满足数据中心及企业级应用的需求了,这在论文作者的 PPT 里面有计算结果:

QLC Projection

  • 未来 QLC SSD 的 PE Cycle Limit 预计在 1k ~ 3k 之间
  • 如果按 5 年寿命计算,约有 86% ~ 95% 的盘可以用 QLC 替代
  • 如果按 7 年寿命计算,约有 82% ~ 92% 的盘可以用 QLC 替代
  • 最终结论:系统可以整体迁移至 QLC 上

写放大系数分析

写放大系数(Write Amplification Factor, WAF)是影响 SSD 寿命及性能的关键指标,SSD 存在写放大的原因是其内部存在诸多背景任务(housekeeping tasks),如垃圾回收(GC),损耗平均(Wear Leveling)等。学术界和产业界对于如何控制写放大这一问题都做了很多工作,然而实际 SSD 产品这一点做得究竟如何呢?已有的统计研究都不够广泛,规模也相对较小,因此这篇论文的研究就显得比较有价值了。下面就来看下作者的统计结果吧:

Figure 3

  • 此研究中实际观察到的 WAF 比之前已有研究中观察到的(1.x 左右)要高得多,96% 的 SSD WAF 都超过了 1.5,中位数达到了 6 左右
  • WAF 的分布范围很广,10% 分位值仅为 2,中位数 6,然而 99% 分位值达到了 480。这说明不同应用和设备的 WAF 差异性很大。WAF 的影响因素将在下文详细分析
  • 这里又要把 Sandisk 几个型号的 SSD 拿出来重点讨论下了,可以看到它们的 WAF 远高于其他厂商的 SSD,中位数竟然就达到了 100 左右(已经超出上图的范围了,论文中直接给出了具体值)。从上文的应用写入速度分析中可以看到,Sandisk 的 SSD 写入量并没有更高,实际使用上也没有任何特殊的地方,所以不能用应用负载差异性来解释此问题,这是 Sandisk SSD 自己的锅跑不掉了
  • 作者对这一明显异常的问题进行深入研究后发现,Sandisk 的 SSD 之所以有这么高 WAF 的原因在于其背景任务执行得极为频繁,可以说是一有空就开始做背景任务了。然后,最搞笑的来了,这些背景任务是在干嘛呢?既不是在做 GC 也不是在进行损耗平均(绝大部分情况下这两部分是 WAF 的主要来源),而是在极为激进的重写 Block。那为什么要重写呢?因为频繁检测到 Block ECC 错误了!此时不得不重写整个 Block 来避免数据丢失……🤣

这感觉是全文最大的亮点啊,看到这简直是惊呆了,消费级不知名小厂做的 SSD 很垃圾不能用也就罢了,Sandisk 好歹也是个国际大厂了,做的企业级 SSD 也能这么垃圾简直是万万没想到啊……这些 SSD 还都是 MLC 颗粒的,这么糟糕的表现是 Flash 颗粒用得太差还是 FTL 固件写得水平太差就不得而知了……


最后来看下应用负载特性与 WAF 的关系:

  • 同一个型号的 SSD 也表现出了很大的 WAF 差异,其 95% 分位值是中位数的 9 倍以上。同一型号的盘会被用在不同应用上,因此合理的解释就是不同应用负载情况下 WAF 会表现出很大的差异性
  • WBC 应用的 WAF 比 AFF 应用要小 ,这也就是前文观察到的,尽管 WBC 写入量要高更多,然而二者实际 SSD 损耗速度差不多的原因了。因此可以说 WBC 应用在某种程度上对 SSD 更为友好

学术界由于没有那么多真实 SSD 可以用,因此在研究 SSD WAF 时往往使用仿真的方法,然而根据本文的结论,这些仿真得到的 WAF 都太小了,绝大部分已有理论研究论文中 WAF 最高也就 10 左右,这仅仅只是 NetApp 真实环境中的 60% 分位值。作者认为造成这一差异的主要原因有:

  • 理论研究所使用的 IO Trace 数据太古老了,已经没法反映当今实际运行在 SSD 上的应用负载。此外古老的 IO Trace 数据很多是基于 HDD 盘抓取的,不会存在 TRIM 等 SSD 特有命令
  • SSD 仿真软件(如 FEMU)对 FTL 固件的行为仿真存在很大困难,很有可能使用的只是理想模型,这与实际行为差异会很大,且 FTL 固件每家厂商,甚至是不同型号都是有区别的,这让仿真的准确度变得更低了

损耗平均效果分析

损耗平均(Wear Leveling)就是把写入尽量平均的打散到所有 Block 上,以此避免某些 Block 被频繁的擦写,造成其寿命下降及性能降低。损耗平均技术是以整体的 PE Cycle 增加来换取长尾减少的,因此实际实现上需要做一个平衡——太过激进的损耗平均会导致 SSD 整体寿命衰减得太快。为了衡量损耗平均的效果,作者引入了擦除率(Erase Ratio)及擦除均匀度(Erase Difference)这两个指标:

Erase Ratio & Erase Difference

Erase Ratio 的理想值是 1,对应的 Erase Difference 的理想值是 0。实际当然不会这么理想:

Figure 4

  • Erase Ratio 的中位数是 1.55,意味着写入量最多的 Block 比平均值多写入了 55% 的数据
  • 5% 的设备 Erase Ratio 大于 6 了,这意味着部分 Block 可能会在全盘只用了 16% PE Cycle 的时候就报废了,这会对 SSD 的整体性能,特别是长尾表现造成明显影响
  • 部分型号的 SSD 损耗平均做得很好,十分接近理论值,说明这个要做好是可以做好的
  • 然而,这时候又要把 Sandisk 的 SSD 拿出来批判一番了,从图中可以很明显的看到 Sandisk 那几款 SSD 损耗平均做得相当之差,尽管这几款 SSD 有着异常高的 WAF,这么高的 WAF 还做出了这么糟糕的损耗平均效果,实在是让人震惊啊……

空间使用率分析

这一部分没太大意思,作者分析了一下不同使用年限,不同大小的 SSD 在 AFF 应用场景下空间使用率有啥区别(WBC 应用空间使用率无意义,基本都是 100%):

Figure 5

  • 大部分 SSD 处于半满状态
  • 空间使用率在用了 1~2 年后就基本稳定了
  • 越大空间的 SSD 空间使用率越高,原因是购买大空间需要更多的钱,因此用户会对自己需要多少空间做出更细致准确的评估

写放大系数的影响因素

直接给出作者在 PPT 中的总结表格吧:

Which factors impact WAF?

结论很简单,FTL 固件算法做得如何是决定性因素;写入负载也有明显影响;其余因素基本没影响。

FTL 固件实现

作者此处选用了 III-A 这款 SSD 为例进行分析,这款 SSD 最初的固件版本是 FV2,后面升级到了 FV3:

Figure 6

可以看到这次纯软件固件升级有显著优化作用,明显改善了其 WAF;更不要说前面分析过的 Sandisk 产品和 Samsung 产品的差距了。由此可见,SSD 远远不只是搞一些 Flash 颗粒芯片来组装下就好了的,主控软件算法的水平同样是决定性的;甚至可以说,主控的影响有时候比颗粒类型更重要——Samsung 用消费级 TLC 颗粒做出来的 SSD 整体寿命比 Sandisk 用企业级 MLC 颗粒做出来的 SSD 还要好。

负载特性

直接进行 IO Trace 是记录负载特性最有效的方法,然而对于大规模系统来说这是基本不可行的。因此作者用 DWPD,SSD 容量,SSD 接口类型这几个指标来对负载类型进行了一个简单分类。SSD 容量和接口类型能用于区分负载类型同样是由于不同容量和接口类型的 SSD 被用于了不同产品和客户上。

这部分的图不是那么直观就不放了,直接给结论吧:

  • 越高的 DWPD 会对应越低的 WAF。这个结论前文也提到了,可能的原因是,很多 FTL 固件实现上是以固定的频率在进行背景任务的,没有与当前的写入量耦合起来,因此较高的 DWPD 减少了背景任务的占比,进而提高了 WAF
  • 较大容量的 SSD WAF 相对也较小一些,不过这个影响不大
  • NVME 接口的 WAF 要小于 SAS,这个更有可能的原因是,NVME 接口更新,使用 NVME 的业务也会更新一些,也就会更多的考虑 SSD 的特性进行优化

空间使用率

作者的结论是没有明显影响

预留空间大小

这是指 SSD 厂商在内部预留的空间(Over-Provisioning,OP),通常认为这会对 WAF 有明显影响。然而实际看下来影响不大,甚至是有轻微的负相关关系,即预留空间越大的 SSD 反而 WAF 也越大。比如 Sandisk 的那几款 SSD,预留空间达到了惊人的 44%,然而还是被 Samsung 预留空间只有 7% 的 SSD 吊打。

这仔细一想其实也很好理解,预留多少空间当然是根据 FTL 固件的需求决定的,写得越差的 FTL 固件很有可能就需要越多的预留空间……

多流写技术

多流写(Multi-stream Writes, MSW)技术需要主机端在写入的时候指定一个 Stream ID,支持此特性的 SSD 会根据此 Stream ID 将具有相同或相似生命周期的数据写入到相同的 Block 中去,以此实现冷热数据分离,预期可以大幅提高 GC 时的效率,减少 WAF。此技术的详细介绍可参考文末参考资料中的几篇文章。

论文中对于多流写技术的影响结论是不确定,原因是缺乏足够的数据进行判断。

结论

看完全文主要收获有:

  • SSD 容量真是越来越大了,30T 的都有了
  • 大部分 SSD 没想象的那么脆弱的,好点的 SSD 一天好几 T 的写入量也可以用 10 多年,将来用上 QLC 也没有什么问题
  • SSD WAF 是很大的,在真实场景下可能会到 10 以上,然而不用太过于担心这个问题,厂商是考虑过这个问题的,给出的寿命及性能指标是考虑了这些的
  • 多流写听起来很厉害的样子
  • SSD 固件差异那是真的大啊
  • Sandisk 就是垃圾…… Samsung 还真不错

参考资料:

论文原文及 Presentation

浅析企业级SSD Multi-Stream Write技术

Increasing SSD Performance and Lifetime with Multi-Stream Write Technology

文章目录
  1. 1. 引言
  2. 2. 统计数据分析结果
    1. 2.1. 读写比例分析
    2. 2.2. 应用写入速度分析
    3. 2.3. NAND 使用损耗分析
    4. 2.4. 写放大系数分析
    5. 2.5. 损耗平均效果分析
    6. 2.6. 空间使用率分析
  3. 3. 写放大系数的影响因素
    1. 3.1. FTL 固件实现
    2. 3.2. 负载特性
    3. 3.3. 空间使用率
    4. 3.4. 预留空间大小
    5. 3.5. 多流写技术
  4. 4. 结论