FTL之垃圾回收、写放大和OP

原创内容,转载请注明:  [http://www.ssdfans.com]  谢谢!

本文虚构了一个小小的SSD空间,来讲讲FTL的几个重要知识点:垃圾回收(Garbage Collection,GC,或者叫Recycle),写放大(Write Amplification)和OP (Over Provisioning)。

麻雀虽小五脏俱全。翠花,上麻雀。

我们假设该SSD底层有4个通道(Channel,CH0-CH3),连接着4个Die (每个Channel上的Die可并行操作),假设每个Die只有6个Block(Block0-Block5),所以一共24个Block。每个Block内有9个小方块,每个小方块的大小和Host Page大小一样。24个Block中,我们假设其中的20个Block大小为SSD容量,就是Host端看到的SSD大小;另外4个Block是超出SSD容量的闪存空间,我们称之为OP。OP作用,一方面,用以存储SSD内部数据,如映射表等;另一方面,减小写放大,提升SSD性能,后面会讲。

好,一个SSD摆在我们面前,蛋蛋开始写小电影了。

我们顺序写入4个host page,分别写到不同Channel的Die上,这样写的目的是增加底层的并行性,提升写入性能。

Host继续顺序写入,SSD则把数据交错写入到各个Die上,直到写满整个SSD空间(Host端看到的)。如下:

整个盘写满了,如果蛋蛋想放入更多的小电影,怎么办?不能怎么办,只能把看过的小电影割爱删除了,腾出空间放新的小电影。

继续拷入小电影。

假设还是从Host Page 1开始写入。这个时候,SSD会把新写入的Host Page写入到之前所谓的OP空间。对SSD来说,不存在什么Host空间和OP空间,它只看到闪存空间。Host来数据,SSD就往闪存空间写。

上面有人红了,怎么回事?因为Host Page 1-4的数据已更新,写到新的地方,那么之前那个位置的Host Page 1-4数据就失效了,过期了,变垃圾了。所谓的垃圾回收,垃圾指的就是这种被覆盖写了的数据。

继续顺序写入,红人越来越多。所有闪存空间都写满后,小SSD世界就是下面这个样子:

等所有Die上的Block 5写满后,所有Die上的Block 0也全红了。

现在不仅整个Host空间都写满,整个闪存空间都满了。如果Host想继续写入后续的Host Page (36之后的) ,怎么办?

这个时候,就需要垃圾回收了。垃圾回收,就是把某个Block上的有效数据(上图中绿色的)读出来,重写,然后把该Block擦除,就得到新的可用Block了。

上例中,由于我们是顺序写入,垃圾集中在Block 0上,上面没有任何有效数据,我们把它们擦除就可以腾出新的写入空间。Host就可以把新的数据写入到垃圾回收完成的Block 0上了。

从这个例子中,我们可以看到:顺序写,即使是闪存空间写满后的写 (Full Drive写),性能也是比较好的,因为垃圾回收可以很快完成 (也许仅仅只要一个擦除动作)。

但现实是残酷的。Host写入数据,更多的可能是随机写入数据。下面是一个闪存空间第一次写满后的样子:

Host继续往SSD上写入数据,那么SSD怎么处理?当然需要做垃圾回收。

可世道变了,SSD内部状况比之前看到的复杂多了,垃圾数据分散在每个Block上,而不是集中在某几个Block上。这个时候,如何挑选需要回收的Block呢?是的,挑垃圾比较多的Block来回收,因为有效数据少,要搬移的数据少,这样腾出空Block的速度快。当然,在挑Block的时候,还要考虑该Block的PE count,一般挑Block Count小的,这样就能做到 Wear Leveling。挑选做垃圾回收的Block,需要综合考虑垃圾数、PE count等因素。

对上面每个Block的垃圾数(红色方块)做个统计:

由于我们是同时往4个Channel上写,我们需要每个Channel都有一个空闲的Block,因此,我们做垃圾回收时,不是回收某个Block,而是所有Channel上都要挑一个。一般选择每个Die上Block号一样的所有Block做垃圾回收。上例中,Block 0上的垃圾数量最多(24个红色方块,最多),因此我们挑Block 0作为垃圾回收的Block (这里忽略PE count等因素,只看垃圾数)。

回收完毕,我们把之前Block 0上面的有效数据(绿色方块)重新写回到这些Block (这里,我们假设回收的有效数据和Host数据写在同一个Block,实际,它们可能是分开写的)。

这个时候,有了空闲的空间(白色方块),Host就可以继续写入数据了。

在继续进行下去之前,做个小结:

闪存空间在没有写满之前,SSD是无需做GC的,因为总有空闲的空间可写的。SSD使用早期,由于没有触发GC,无需额外的读写,所以速度很快,慢慢的会发现SSD变慢了,主要原因是SSD需要做GC。

从前面图来看,如果Host顺序写的话,垃圾比较集中,利于SSD做垃圾回收;如果Host是随机写的话,垃圾产生比较分散,SSD做垃圾回收相对来说就更慢,所以性能没有前者好。

由于GC的存在,就存在一个问题,Host要写入一定的数据,SSD为了腾出空间写这些数据,需要额外的做一些数据的搬移,也就是额外的写,最后导致的后果往往就是SSD往闪存中写入的数据比实际Host写入SSD的数据多。因此,我们SSD中有个重要参数,就是写放大,WA。

对空盘来说(未触发GC),写放大一般为1,即Host写入多少数据,SSD写入闪存也是多少数据量(这里忽略SSD内部数据的写,如映射表的写入)。在Sandforce控制器出来之前,写放大最小值为1。但是由于Sandforce控制器内部具有实时数据压缩模块,它能对Host写入的数据进行实时压缩,然后再把它们写入到闪存。举个例子,Host写入8KB数据,经压缩后,数据变为4KB,如果这个时候还没有垃圾回收,那么写放大就只有0.5。

来看看GC触发后,WA是怎么算的。以前面GC为例,我们挑选每个Die上的Block 0做垃圾回收:


一共36个方块,其中有12个有效数据块,我们做完垃圾回收后,需把这12个有效数据块写回:


后面还可以写入24个方块的Host数据。因此,为了写这24个方块的Host数据,SSD实际写了12个方块的原有效数据,再加上该24个方块的Host数据,总共写入36个方块数据,按照写放大定义。WA= 36/24 = 1.5

写放大越大,意味着写入闪存的数据越多,对闪存磨损就越厉害,因此,SSD设计的一个目标不是没有蛀牙,而是让WA尽量小。减小写放大,可以使用前面提到的压缩办法(主控决定),顺序写也可以减小写放大
(垃圾集中,但顺序写可遇不可求),还有就是增大OP (这个可控)。

增大OP怎么就能减小写放大?

先定义OP比例=(闪存空间用户空间)/用户空间

还是以前面SSD空间为例,SSD容量是180个小方块,当OP36个小方块时,整个SSD空间为216个小方块,OP比例是36/180= 20%。那么180个小方块的Host数据平均分摊到216个小方块时,每个小方块的平均有效数据为180/216 = 0.83,一个Block上的有效数据为0.83*9 = 7.5,也就是一个Block上面平均有7.5个小绿块和1.5个小红块。为了写1.5Host数据方块,需要写9个方块的数据(原有7.5个有效数据,加1.5Host数据),写放大是9/1.5 = 6

如果整个SSD闪存空间不变,还是216个小方块,调整OP比例至72个小方块
OP比例50%),因此,SSD容量就变成144个小方块。144个小方块的Host数据平均分摊到216个小方块时,每个小方块的平均有效数据为144/216 = 0.67,一个Block上的有效数据为0.67*9 = 6,也就是一个Block上面平均有6个小绿块和3个小红块。为了写3Host数据方块,需要写9个方块的数据(原有6个有效数据,加3Host数据),写放大是9/3 = 3

从中看出,OP越大,写放大减小。很好理解,OP越大,每个Block有效数据越少,垃圾越多,因此需要重写更少的数据,因此写放大越小。同时,由于GC需要重写的数据越少,SSD满盘写性能也越好。

当然,上面说的都是最坏情况。实际中,垃圾数据更多时候并不是平均分配到每个Block上去,有些Block上的垃圾多,有些Block上的垃圾少,实际GC挑选Block,是挑垃圾多的,因此,实际写放大是小于前面的计算值的。

OP大小和写放大以及SSD耐写性的关系见下图:


总结一下:

WA越小越好,因为越小意味着对闪存损耗越小,可以给闪存延年益寿;OP越大越好,OP越大,意味着写放大越小,意味着SSD写性能越好

 

 

 

 

 

分类目录 闪存.
扫一扫二维码或者微信搜索公众号ssdfans关注(添加朋友->点最下面的公众号->搜索ssdfans),可以经常看到SSD技术和产业的文章(SSD Fans只推送干货)。
ssdfans微信群介绍
技术讨论群 覆盖2000多位中国和世界华人圈SSD以及存储技术精英
固件、软件、测试群 固件、软件和测试技术讨论
异构计算群 讨论人工智能和GPU、FPGA、CPU异构计算
ASIC-FPGA群 芯片和FPGA硬件技术讨论群
闪存器件群 NAND、3D XPoint等固态存储介质技术讨论
企业级 企业级SSD、企业级存储
销售群 全国SSD供应商都在这里,砍砍价,会比某东便宜20%
工作求职群 存储行业换工作,发招聘,要关注各大公司招聘信息,赶快来
高管群 各大SSD相关存储公司高管和创始人、投资人

想加入这些群,请微信扫描下面二维码,或搜索nanoarchplus,加阿呆为微信好友,介绍你的昵称-单位-职务,注明群名,拉你进群。SSD业界需要什么帮助,也可以找阿呆聊。