4.3 垃圾回收
4.3.1 垃圾回收原理
WA(Write Amplification),即写放大。
OP(Over Provisioning),即预留空间。
4.3.2 写放大
对于空盘来说(未触发GC),写放大一般为1,即用户写入多少数据,SSD写入闪存也是多少数据。
GC触发后,WA怎么算?以下面的Block为例,深色的是垃圾数据,浅色的是有效数据,
一共36个方块,其中有12个有效数据块,做完垃圾回收后,需把这12个有效数据块写回,如下,
增大OP为何能减小写放大?
OP比例 = (闪存空间 - 用户空间)/(用户空间)。
SSD容量 = 主机端看到的SSD大小,即用户空间。
闪存空间 = SSD容量 + OP空间。
影响写放大的因素主要有:
(1)OP:OP越大,写放大越小;
(2)用户写入的数据Pattern:顺序写,GC做的量就少,写放大就小;
(3)GC策略:挑选有效数据最少(垃圾数据最多)的Block,写放大就小;
(4)磨损均衡:为平衡每个Block的擦除次数,需要数据的搬移,写放大就大;
(5)读干扰和数据保持:数据搬移增加写放大;
(6)主控:带压缩和不带压缩的控制器会影响写放大;
(7)Trim:有没有Trim,对写放大影响很大。
4.3.3 垃圾回收实现
1. 步骤
(1)挑选源Block;
(2)从源Block中找到有效数据;
(3)把有效数据写入到目标Block。
详细步骤如下:
(1)挑选源Block。
一般常见的算法是挑选有效数据最小的Block,这样需要重写的有效数据越少,写放大页越小。这种BPA算法叫做Greedy算法,是绝大多数SSD采用的一种策略。
(2)把数据从源Block读出来。怎么读才最有效率?有以下三种方法:
1)方法一
固件FW在往一个Block上写入逻辑页时,会更新和维护闪存块的有效数据量,因此可以快速挑选中源闪存块。
该方法的缺点:固件开销大。
2)方法二
如果没有每个闪存块的有效数据Bitmap,FW做GC时,可以选择把所有数据都上来。那,这些数据中,哪些是有效数据(需要重写的)呢?
该方法的缺点:GC做的慢。
3)方法三
(3)重写。即把读出来的有效数据写入闪存。
4.3.4 垃圾回收时机
有两种:前台垃圾回收和后台垃圾回收。均是由SSD自己内部控制的!
1. 前台垃圾回收Foreground GC
当用户写入数据时,可用的Block小于一定的阈值,此时需要做GC,以腾出空间给用户写。
被动的做GC。
2. 后台垃圾回收BackGround GC
在SSD空闲(Idle)时,SSD主动去做的GC。
4.4 Trim
Trim是一个新增的ATA命令(Data Set Management)。当用户删除一个文件时,操作系统会发trim命令给SSD,使SSD知晓这些数据已无效,可以被回收掉,从而避免了无谓的数据搬移。
4.5 磨损平衡Wear Leveling
1. 含义:磨损平衡,就是让SSD中的每个Block的磨损(擦除)都保持均衡。
2. 需要磨损平衡的原因:闪存是有寿命的,即擦写次数有限。
3. 如何实现磨损平衡的?
冷数据(Cold Data):用户不经常更新的数据;
热数据(Hot Data):用户频繁更新的数据;
年老的(Old):擦写次数(EC,Erase Count)比较多的Block;
年轻的(Young):擦写次数比较少的Block。
4. 磨损平衡算法
有动态磨损平衡(Dynamic WL)和静态磨损平衡(Static WL)两种。
动态磨损平衡:把热数据写到年轻的Block上;
静态磨损平衡:把冷数据写到年老的Block上。
为什么冷热数据混在一起不好呢?冷热数据混合在一起,那么冷数据就可能经常需要被搬移到另一个Block上,会引入额外的写,导致写放大增大。
如何解决该问题呢?做静态磨损平衡的时候采用专门的Block存放冷数据。