背景
- 闪存基本构成:页page(4K)→块block(通常64个page组成一个block,有的是128个)→面plane(多个blcok组成)→die(plane就是一个die)→闪存片(多个die组成)→SSD(多颗闪存片组成);(可能不同型号具体数字不同)。
- SSD上已经被写入过的Page页在重新被写入之前,必须要将page页所在的block块擦除,而不是直接覆盖写。这个是由Nand Flash的工作原理决定的。因此产生了Gc的概念;
gc触发的位置
- FTL层
gc分类:
- 限制垃圾回收:不占用主控资源,会增加一定额外的写放大。
- 被动垃圾回收:被动垃圾回收是在数据读写同事做垃圾回收,会占用大量主控资源,对请求的响应时间造成一定影响。
gc粒度
- 闪存最小读写单位是page,但是最小擦除单位是block;
gc过程
- 一个block中包含多个page;SSD工作一段时间之后,block就都是有过写入的了,如果要擦除某个block,必须先将其中的有效page复制到其他地方,再擦除旧的block;
我们通过下图来看看SSD上数据写入的过程
图1:
- 两个空的(erased)的Block X和Block Y, 每个Block有12个Pages;
- 首先在Block X中写入4个Pages(A, B, C, D);
图2:
- 接着再向Block X中写入新的4个pages(E, F, G, H)
- 然后写入PageA-D的更新数据(A', B', C', D'), 这是PageA-D变为失效数据(invalid);
- 如果在覆盖写操作比较多的情况下,会产生较多的无效页,类似于磁盘碎片,此时需要SSD的GC机制来回收这部分空间了。
图3:
- 为了向PageA-D的位置写入数据,需要将E, F, G, H, A', B', C', D' 8个pages先搬到Block Y中, 之后再把Block X erase掉,这个过程就为GC。
SSD的写放大(Write Amplification)
SSD的GC机制会带来写放大(Write Amplification)的问题,即内部真正写入的数据量大于用户请求写入的数据量,会带来下面两个问题:
- SSD的寿命减少。NAND-Flash中每个原件都有擦写次数限制,超过一定擦写次数后,就只能读取不能写入了。因此,需要损耗均衡控制(Wear-Leveling)算法,使得原件的擦写次数比较平均,进而延长SSD的寿命。
- 因为gc需要有擦除操作,复制有效page,因此会影响响应时间;
预留空间 (Over-Provisioning)
由SSD gc引出的一个概念Over-Provisioning
计算方式如下:
Over-Provisioning相当于在用户可用的容量之外,额外增加的空间;
因为SSD上不仅要存放用户数据,还需要存放Mapping Data、FTL管理数据,并且要处理GC/WL(Wear-Leveling)磨损均衡的数据搬迁,以及处理坏块管理等。额外增加的Over-Provisioning主要承担这些操作的存储工作;这部分容量用户不可以直接操作,对操作系统也不可见;
参考资料
https://www.seagate.com/tech-insights/ssd-over-provisioning-benefits-master-ti/
SSD Over-provisioning (OP) - Kingston Technology