nand读写操作以page为单位,擦除以块为单位。数据删除以及覆盖写,都会造成无效数据。数据删除时之前的映射关系解除,数据覆写时找干净的位置写入并建立新的映射关系。
两种策略:
主动GC:或者说空闲时的后台垃圾回收(background GC)。fw定时检查剩余可用的block,如果需要就在没有IO操作时,controller利用这个空闲时间来提前做GC,避免对请求造成不必要的延时,利于保持SSD的性能。
被动GC: 企业级或工业级SSD一般24小时工作,一直没有空闲时间,主动GC无法有效执行。因此需要被动GC。
1. 写入数据时判断当前可用块与设置的阈值比较,低于设置的阈值时进行GC,fw中有定义GC时回收多少空间。这时写入请求的延迟对性能造成影响;
2. WL(wear leveling) 造成的GC;
3. 处理ECC错误block造成的GC。
GC流程就是把几个block中的有效数据读取到cache或OP拼接好后写入新block,原来的块就全部是无效数据,可以擦除后加入干净block链表,用于写入新数据。这样也就带来了写放大。
GC相关的算法:
贪心算法(Greedy Algorithm):需要一个表记录Block中有效页的数量