怎么使用SSD才能避免越写越慢?

描述

垃圾回收(Garbage Collection,GC)是FTL的一个重要任务。我们虚构一个小小的SSD空间,来讲垃圾回收原理,以及与之紧密联系的WA(Write Amplification,写放大)和OP (Over Provisioning,预留空间)等概念。

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

固态硬盘

图1-1 虚构的小小SSD空间

我们假设该SSD底层有4个通道(Channel,CH0-CH3),连接着4个Die (每个Channel上的Die可并行操作),假设每个Die只有6个闪存块(Block0-Block5),所以一共24个闪存块。每个闪存块内有9个小方块,每个小方块的大小和逻辑页大小一样。24个闪存块中,我们假设其中的20个闪存块大小为SSD容量,就是主机端看到的SSD大小;另外4个闪存块是超出SSD容量的预留空间,我们称之为OP (Over Provisioning)。

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

固态硬盘

图1-2 主机写入4个逻辑页数据后

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

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

固态硬盘

图1-3 用户空间写满后的SSD

整个盘写满了(从用户角度来看整个用户空间写满了,但在闪存空间,由于OP的存在,并没有写满),如果蛋蛋想放入更多的小电影,怎么办?不能怎么办,只能把看过的小电影割爱删除了,腾出空间放新的小电影。

继续拷入小电影。

固态硬盘

图1-4 删除4个逻辑页后再次写入4个逻辑页

假设还是从逻辑页1开始写入。这个时候,SSD会把新写入的逻辑页写入到所谓的OP空间。对SSD来说,不存在什么用户空间和OP空间,它只看到闪存空间。主机端来数据,SSD就往闪存空间写。上面有人红了,怎么回事?因为逻辑页1-4的数据已更新,写到新的地方,那么之前那个位置上的逻辑页1-4数据就失效了,过期了,变垃圾了。用户更新数据,由于闪存不能在原位置覆盖写,固件只能另找闪存空间写入新的数据,因此导致原闪存空间数据过时,形成垃圾。

继续顺序写入,红色方块越来越多(垃圾数据越来越多)。所有闪存空间都写满后,小SSD世界就是下面这个样子:

固态硬盘

图1-5 闪存空间写满

等所有Die上的Block 5写满后,所有Die上的Block 0也全红了(这些数据都是垃圾)。

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

这个时候,就需要垃圾回收了。我们暂时从之前的SSD系统中走出来,看看什么是垃圾回收。

这里需要说明的是,实际中是不会等所有闪存空间都写满后才开始做GC的,而是在满之前就触发GC,这里只是为描述GC而做的假设。

垃圾回收,就是把某个闪存块上的有效数据(图4-19中绿色的)读出来,重写,然后把该闪存块擦除,就得到新的可用闪存块了。

固态硬盘

图1-6 垃圾回收示例

图中,Block x上面有效数据为A,B,C,Block y上面有效数据为D,E,F,G,红色方块为无效数据。垃圾回收机制就是先找一个可用Block z,然后把Block x和Block y的有效数据搬移到Block z上面去,这样Block x和Block y上面就没有任何有效数据,可以擦除变成两个可用的闪存块。

固态硬盘

图1-7 擦除垃圾数据块变成可用数据块

回到我们的小小SSD系统中来。

上例中,由于我们是顺序写入,垃圾集中在Block 0上,上面没有任何有效数据,我们把它们擦除就可以腾出新的写入空间。用户就可以把新的数据写入到垃圾回收完成的Block 0上了。 从这个例子中,我们可以看到:顺序写,即使是闪存空间写满后的写(Full Drive写),性能也是比较好的,因为垃圾回收可以很快完成(也许仅仅只要一个擦除动作)。

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

固态硬盘

图1-8 随机写满闪存空间后的SSD

用户如果继续往SSD上写入数据,那么SSD怎么处理?当然需要做垃圾回收。 可世道变了,SSD内部状况比之前看到的复杂多了,垃圾数据分散在每个闪存块上,而不是集中在某几个闪存块上。这个时候,如何挑选需要回收的闪存块呢?是的,挑垃圾比较多的闪存块来回收,因为有效数据少,要搬移的数据少,这样腾出空闪存块的速度快。

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

固态硬盘

表1-1 每个闪存块上垃圾数据统计

由于我们是同时往4个通道上写,我们需要每个通道都有一个空闲的闪存块,因此,我们做垃圾回收时,不是回收某个闪存块,而是所有通道上都要挑一个。一般选择每个Die上块号一样的所有闪存块做垃圾回收。上例中,Block 0上的垃圾数量最多(24个红色方块,最多),因此我们挑Block 0作为垃圾回收的闪存块(这里忽略PE count等因素,只看垃圾数)。 回收完毕,我们把之前Block 0上面的有效数据(绿色方块)重新写回到这些闪存块(这里,我们假设回收的有效数据和用户数据写在同一个闪存块,实际,它们可能是分开写的)。

固态硬盘

图1-9 做完垃圾回收后的BLOCK0可以继续写入数据

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

江湖传言:SSD越写越慢。没错,其实这是有科学依据的:可用闪存空间富裕时,SSD是无需做GC的,因为总有空闲的空间可写。SSD使用早期,由于没有触发GC,无需额外的读写,所以速度很快。慢慢的会发现SSD变慢了,主要原因是SSD需要做GC。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分