悬崖边的探讨——聊一聊闪存的垃圾回收

存储 存储软件
随着技术的进步以及成本的降低,闪存已经越来越广泛的被企业级数据中心作为存储介质使用。相比传统的磁盘介质,闪存的优势显而易见:速度快,耗电低,省空间。特别在速度方面,闪存具备压倒性的优势。

 随着技术的进步以及成本的降低,闪存已经越来越广泛的被企业级数据中心作为存储介质使用。相比传统的磁盘介质,闪存的优势显而易见:速度快,耗电低,省空间。特别在速度方面,闪存具备压倒性的优势。

比方说,客户原来采用某款高端磁盘阵列的时候,处理某个作业,需要花费6个小时。后来采用了闪存阵列,同样处理该作业,只需要1个小时就可以完成。闪存带来的性能优势非常的明显。

以上,并不是本文讨论的重点。

本文的重点是,客户刚刚采用闪存阵列的时候,处理作业只用1个小时,可是运行了一段时间之后,忽然有一天,客户发现处理作业用了1小时25分钟。于是,问题来了,客户一方面觉得1小时20分钟比6小时还是快多了,一方面也会想,为啥比起1小时,我现在处理作业的时间慢了4分之1?

[[222262]]

由此,我们来了解一下,闪存中的“写悬崖(Write-Cliff)”现象。

什么是垃圾回收?

闪存是电子类介质,它处理数据的写入和传统的磁类介质(磁盘或者磁带)不同。在使用磁盘时,如果我们有新数据写入某区块,而该区块还存有旧数据,那只需要简单的进行覆盖即可。而闪存不同,新数据写入的区块,必须是空白区块,如果该区块存有旧数据,那么必须先对旧数据进行“擦除”(Erase)。是的,当数据存储的越来越多,理论上最多当写入的数据总量达到闪存提供的所有容量之后,再次写入更新时,就必然会产生“擦除”。

相比于常规的读取和写入操作,擦除有2个特点。

***,擦除的速度比读写要慢。

第二,擦除的处理单位要比读写大。

目前业界的闪存,基本上,读操作的处理单位不大于4KB,写操作的处理单位不小于4KB,而擦除的处理单位则是不小于1MB。这意味着,如果要写入4KB的数据,到某个已存有4KB旧数据的区块,那我首先需要擦除其周边1MB的区块空间。

这相当于您买了一套二手房三居室,规定要求说不能直接住,必须先还原成毛坯房再重新装修,而且要求您必须先把整个小区250个住户的房子全部恢复成毛坯房,然后才能重新装修自己家。可是其余249个邻居住的好好的,他们家里的东西怎么办,答案只有一个,就是请他们全部把家搬走,搬到其他小区空着的房子里去。(好吧,强制拆迁啦!!)当然,搬完之后有个好处,就是未来再有249个新住户进来,他们可以就在毛坯房的基础之上直接进行装修了(1MB一次性全部擦除)。

以上过程,我们称之为闪存擦除效应带来的“垃圾回收”。为了更清晰的描述这个过程,借(Chao) 用(Xi) 某闪存厂商的图片,来更为清晰的解释一下。

 简便起见,如下图所示,假设某闪存设备一共提供了16个可写的小块,一次擦除必须以4个小块为单位。

首先,我们写入了一个“MyFile.doc”文件,占用了6个小块,由于现在的16个块都是“干净”的空白状态,所以直接写入即可。如下图。

然后,我们更新了“MyFile.doc”文件。注意,在这里,作为用户,我们认为自己是在原来的位置上对文件数据进行了更新。但是闪存为了更快的完成处理,会物理上将新数据写入另外的“干净”区块,并将原有旧数据所在区块标记为“失效”状态。如下图(灰色代表“失效,未擦除”数据块,蓝色代表“已占用”数据块,白色代表“干净,可写入”数据块)。

(同时为了解决应用程序地址和实际物理存储地址的对应问题,闪存加入了“Flash Translation Layer”,用来实现上述两个地址的映射。)

接下来,我们又需要写入一个新文件“AnotherFile.doc”,同样占用6个小块,但是现在上图中只剩下4个空白的“干净”小块了。因此,我们需要擦除左上角“失效”的4个小块,擦完之后如下图所示。

接下来,新的数据就可以被写入到左上和右下总共的6个“干净”小块了。

现在,我们写入***一个文件,需占用3个小块。可以从上图看到,空白“干净”小块只剩2个了。另外还有2个“失效”小块,但是由于与有效数据同处一个擦除区域,无法直接擦除。因此,我们就需要进行数据的移动,如下图所示,从而腾出一个整体的空间,使得擦除可以进行。这一步,就是之前讲的邻居搬家。

擦除完之后,我们就可以写入占用了3个小块的新文件了!

闪存“垃圾回收”带来的“写悬崖”和“写放大”

回到文章一开始客户遇到的性能下降25%的问题,在我们了解完闪存垃圾回收的过程之后,就很容易理解了。一台40TB容量的闪存运到客户现场,起始都是“干净”的空白小块,写入速度很快。但随着数据的不断更新,或早或晚必然会出现区块间数据搬运,数据擦除等后台垃圾回收的相关操作,从而提供“干净”的小块给后续的写入操作。这些操作和前端应用程序并行,导致了性能的下降,我们称之为“写悬崖(Write-Cliff)”。

“写悬崖”仅仅是垃圾回收带来的问题之一。垃圾回收还带来的另外一个问题,叫做“写放大”。我们都知道闪存的每个Cell(颗粒)都是有写入次数的寿命限制的。垃圾回收导致了额外的Cell写入,加速了Cell寿命消耗。我们称之为“写放大(Write-Amplification)”。

如何处理“写悬崖”

写悬崖和写放大都是闪存介质与生俱来的特性,无论是SSD固态硬盘,还是目前的全闪存阵列厂商,都无法避免这两个问题。

闪存厂商一般会通过介质材料,算法以及架构的优化等手段,来将这两种影响控制在一定的范围内。同时,对该问题处理的效果,也是衡量闪存阵列能力的因素之一。比如目前业界市场占用率很高的某闪存阵列厂商,宣称通过以下手段来优化写悬崖的问题:

首先,采用“超供给”方式,通过提供更多的颗粒数量(比如用户可见容量40TB,而实际物理容量超过67TB),用于减缓整体闪存寿命的磨损,并实现更为灵活的预防性垃圾回收。

同时,采用了“带外”的垃圾回收处理机制,也就是为垃圾回收配置了专门的处理引擎,从而不占用处理前端应用数据IO的硬件资源。

此外还有均衡磨损算法,监测机制等手段,来优化缓解这两个问题。

消除误区,“写悬崖”并不可怕

***,需要说明的是,写悬崖并不可怕。

即使写悬崖带了的性能的降低,但速度降下来之后,处理得当的闪存阵列,其性能还是要远远高于传统磁盘阵列。好比您以5块钱一股的价格买了一只股票,***的时候股票价格飙升到了30块钱一股,但后来降到了25块钱一股,并在25块钱平稳下来。那么整体来看,收益还是很好的。

以下是某厂商公布其全闪存阵列“写悬崖”测试的测试结果,我们可以看到,“写悬崖”发生后,该阵列依然运行在一个很高的吞吐量水平上。

当然,在上面的图中我们也看到了另外一个厂商的闪存产品,出现了严重的写悬崖问题。所以在对闪存阵列选型时,一定要搞清楚闪存阵列厂商是否对该问题进行过优化,并***让厂商给出一些有说服力的数据或者测试报告。

责任编辑:武晓燕 来源: 老鸟论IT
相关推荐

2019-12-02 16:23:03

Python编程语言“垃圾”回收

2020-09-08 06:54:29

Java Gradle语言

2023-07-06 13:56:14

微软Skype

2021-12-06 09:43:01

链表节点函数

2023-09-20 23:01:03

Twitter算法

2021-03-01 18:37:15

MySQL存储数据

2021-07-16 11:48:26

模型 .NET微软

2021-08-01 09:55:57

Netty时间轮中间件

2023-09-27 16:39:38

2020-01-03 11:04:54

安全测试渗透

2019-06-12 05:51:59

智慧城市人脸识别互联网

2017-12-22 10:13:21

NFS功能Flex

2011-07-04 16:48:56

JAVA垃圾回收机制GC

2018-05-09 10:45:29

闪存阵列回收

2018-06-07 13:17:12

契约测试单元测试API测试

2021-04-28 08:35:52

区块链技术开发

2021-06-29 08:45:55

逻辑变量法函数

2020-12-11 11:11:44

原子类JavaCAS

2022-08-30 07:39:57

C++namespace隔离

2022-02-16 10:25:36

边缘计算数据中心网络
点赞
收藏

51CTO技术栈公众号