问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(1)

引言

在随机IO访问场景下,固态硬盘(Solid State Drive,简称为 SSD)比传统机械硬盘(Hard Disk Drive,简称 HDD)快了大概2~3个数量级,随着闪存价格的降低,越来越多的业务采用固态硬盘作为其存储介质,极大提升了业务的IOPS,很多KV系统都是要求用其作为存储介质的,例如TiDB等。在和运维要机器的时候都希望服务器配备的是固态硬盘(SSD),但是很少或者没有动机去了解SSD底层的原理,我列举几个SSD的特性,若觉得很新鲜的话,可以接着往下读完本文。

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(2)

术语(名词)说明

为了更好的展开说明,列举一些容易混淆的概念并加以说明。

下同是NVMe盘和SAS盘与CPU之间的连接关系:

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(3)

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(4)

闪存介绍

上面提到闪存在固态硬盘的广泛应用,所以在讲解固态硬盘的各种算法前需要重点介绍一下闪存的特性。

1. 概念与原理

闪存使用三端器件作为存储单元,分别为 源极、漏极和栅极,主要利用电场的效应来控制源极与漏极之间的通断;在栅极 与硅衬底之间增加了一个浮置栅极,浮置栅极可以存储电荷,利用电荷存储来存 储记忆。

擦除:释放浮置栅极的电荷,从而使之变成‘1’,这个动作被称为“擦除”。

编程:向浮置栅极注入电荷,从而使之变成‘0’,这个动作被称为“编程”。

下图是闪存存储单元示意图:

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(5)

2. 内部组织结构

闪存颗粒内部一般由成千上万个大小相同的块(Block) 所组成,块大小一般为数百 KB 到数 MB。每一个块的内部又分为若干个大小相同的页(Page),页的大小一般为 4KB 或者 8KB。

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(6)

3. 数据写入

  1. 向闪存中写入数据时,只能以页为粒度进行写入,如果闪存中某个页已经被写入了数据,那么不能向这个页中再次直接写 入数据,只能在这个页的数据被清空以后才能再次写入。
  2. 闪存进行数据清空的粒度是块,即一次清空动作会将一个块的数据全部抹除。清空动作对应着闪存的擦除动作,即擦除了一个块的数据后,这 个块中所有的 bit 位都变成了 1。
  3. 写入动作对应着闪存的编程动作,将数据写入页时,将特定的 bit 位从 1 变成 0,就使得这个页保存了相应的数据。
  4. 闪存就工作在这样的“擦除”和“编程”循环中,一次这样的循环,被 称为一次擦写(Program/Erase,简称为 P/E)。闪存中每个块的 P/E 次数有限;当某个块的 P/E 次数达到上限后,就无法保证能够继续有效地存取数据。

4. 数据读出

  1. 闪存中保存的数据,经过一段时间后,可能存在若干 bit 位的错误。如果直接将页中读出的数据返回给上层业务,就可能造成业务失败。
  2. 为了保证返回给上层业务的数据是正确有效的,闪存内部预留了部分空间用于保存业务数据的 ECC(Error Correcting Code,纠错码)。每当读取数据时,控制器会使用相应的 ECC 对这些数据进行错误检查和纠正。
  3. 受限于控制器的计算能力,ECC 的纠错范围有限,只能在页面数据中出现bit 位错误的数量不超过一定的上限时才有效。当前主流的 ECC 纠错能力一般是 24bit/1KB,即每 1KB 数据(包含业务数据和 ECC 校验数据) 内出现了 bit 位错误不超过24个时,控制器可以通过计算的方式得出正确有效的业务数据。
  4. 当某个页中的 bit 位错误数超过控制器的计算能力后,该页的业务数据无法被正确读出,此时便产生一个 UNC(Uncorrectable)错误,UNC 错误只能被更高层级的 RAID 机制所修复。

5. 闪存分类

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(7)

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(8)

SSD介绍

上面提到闪存是具体的存储介质,但是光有闪存颗粒是不行的,在其外围还需要有一个控制器,即SSD控制器,同时为了运行各种算法,还需要有一定的内存空间。一块SSD,由控制器、内存、闪存颗粒等单元所组成 。

SSD 没有 HDD 的音圈马达、悬臂等机械部件,因此抗震性极佳,更为重要的还在于可以真正做到多并发和低时延,使其 IOPS 可以超过 HDD 两个数量级以上。

下图是一块真实的SSD示意图:

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(9)

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(10)

提高SSD的可靠性的方法

前面提到闪存颗粒是有P/E次数的限制,超过则会影响SSD存储数据的可靠性,下面的方法或者措施都是从提高SSD的可靠性方面来考量的。

1. 地址空间虚拟化

2. 容量冗余

为了避免部分闪存损坏所导致的整块 SSD 失效,SSD 在设计时都会做到容量冗余。举例,一块标称为 100GB 的 SSD,内部实际的闪存物理容量一般都做到了 110GB 以上。超过标称容量的部分,与标称容量的比值,被称为冗余比。一般而言,冗余比越 大,则 SSD 的可靠性、寿命、性能就越好。企业级存储产品的冗余比一般要达到28%以上。

3. 磨损均衡

磨损均衡(Wear Leveling,简称 WL)所做的事情,就是记录每一个块的 P/E 次 数,然后在需要擦除或者写入数据时,尽量选择那些 P/E 次数相对较少的块。经 过了磨损均衡的 SSD,使用寿命可以得到最大化。

4. 坏块管理

在 SSD 的使用过程中,尽管有各种机制和算法来尽量延长使用寿命,但是闪存的损坏依然是不可避免的。容量冗余为解决闪存损坏的问题提供了基础保证。闪存的损坏,是以页为粒度的,即一个块内部包含了若干的页,可能有的页处于正常状态,另外的一些页处于损坏状态。实际上,当某个块内部出现了多个损坏的页时,这个块的其他页大都处于损坏的边缘。鉴于此,SSD 的固件一般以块为粒度来管理闪存的损坏情况:当发现某个块内部、因为损坏而无法读出数据的页的数量超过某个阈值时,则判定这个块已损坏,随后就将这个块中的有效数据迁移到其他可用的块中,并将这个损坏了的块标记为损坏,自此不再用于保存任何业务数据。

SSD 固件发现坏块的手段包括两种:主机 IO 触发、内部巡检。在SSD生命周期中,大概有1.5%的块会变成坏块。

5. 数据冗余保护

SSD使用多种冗余检查方法来保护用户数据不受位翻转、操作或丢失的影响。

  1. 在SSD控制器内存中使用纠错码(ECC)和循环冗余校验(CRC)来防止数据更改或操作。
  2. 在闪存颗粒中使用低密度奇偶校验(LDPC)和CRC来防止闪存颗粒错误导致的数据丢失。
  3. 在闪存颗粒之间使用异或冗余来防止闪存故障导致的数据丢失。

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(11)

SSD的寿命

SSD 的使用寿命可以直接反映在写入数据量上。

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(12)

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(13)

SSD的垃圾回收

地址空间虚拟化在避免了对相同物理区域反复擦写的同时,也引入了垃圾数据和垃圾页。解释如下:

  1. 主机访问 LBA 100,写入数据 AA,不妨假设 SSD 内部使用编号为401的页来保存数据 AA。
  2. 过了一段时间,主机再次访问 LBA 100,写入数据 BB,由于闪存的特性,编号401的页是不能直接写入的,除非已经经过了擦除,但是SSD的擦除又是以块为单位的,因此需要借助地址空间虚拟化机制让数据BB写入到另外一个页,不妨假设这个页的编号为623。
  3. 经历了上述两个写操作,页 401 保存了数据 AA,页623保存了数据 BB,且 页 401 保存的数据是无用的,页 623 中保存的数据才是有用的。页401中保存的数据被称为垃圾数据,页401 就被称为垃圾页。

垃圾回收(Garbage Collection,简称 GC)的目的就是擦除垃圾数据,让垃圾页变成可以写入数据的干净页。在 SSD 的内部实现中,垃圾回收一般是后台任务,不断监控着 SSD 内部的块和 页的使用情况,当垃圾页过多的时候,就会:

  1. 选择那些包含了较多垃圾页的块,将其中的有效数据迁移到其他块的干净页。
  2. 对那些不再包含有效数据的块执行擦除操作。
  3. 将执行了擦除操作的块放入可用资源池中,以供新的数据写入。

垃圾回收在不断净化 SSD 的同时,也在 SSD 内部制造了更多的写操作,从而使得闪存所真正承载的写入数据量超过了主机写入的数据量,这种现象被称为写放大。当业务模型固定时,闪存真正承载的写入数据量和主机写入的数据量这两者的比 值,不会随着时间的推移而变化,而是以个固定数值为中心点小范围波动,我们 称这个中心点为写放大系数,值越小越好 。

写放大系数的业界主流水准如下,由此可见,虽然SSD能够胜任随机IO访问,但是在业务允许的情况下,能顺序IO访问则更好,这样可以有效减低写放大系数,从而减少闪存的P/E次数,最终提高固态硬盘的使用寿命。

  1. 在全随机小 IO 业务场景下,写放大系数约为 2.5。
  2. 在顺序大 IO 业务场景 下,写放大系数约为 1.1 。

问答如何减少固态硬盘的性能损耗(垃圾回收磨损均衡)(14)

总结

在日常开发过程中,我们很少注意到存储这一层,一方面是存储品牌商已经做了各种屏蔽和封装,另一方面是各个公司的存储系统(关系型数据库和非关系型数据库)已经为业务提供了高QPS低延迟的访问。只有在为这些存储系统选择机器资源的时候才会考虑,要选择那些配备了SSD硬盘的服务器。

从以上的介绍来看,SSD硬盘虽然是底层硬件,但是也涉及非常多的软件算法,真正和硬件打交道的地方只有两个:一是对外的各种接口协议规范,二是和闪存颗粒的擦除和写入接口。存储集中、虚拟化、云化应用场景所依赖的磁盘阵列涉及的算法更多,包括SmartQoS、SmartPartition、SmartVirtualization、SmartMulti-Tenant等等。

,