前面介绍了Greedy,Cost-Benefit, CAT三种算法,本来应该继续介绍CICL了,实际上连参考资料都找好了。
不过前面讲了这么多东西,一直没有提到兵哥跟其他捡垃圾的不同之处,兵哥是一位商人,研究算法从来不是目的,赚钱才是终极使命。
那么兵哥的卖点是什么呢?
垃圾回收有两个重要的问题需要考虑:回收无效Block的时机以及每次回收的数量。因此,又关系到两种回收策略:主动回收策略与被动回收策略。
被动回收策略是当接收到写入请求时,系统根据目前状况判断是否执行垃圾回收,此策略模式下,系统通常会对可用空间设定一个临界值,当可用空间小于临界值时开始执行垃圾回收。每次需要回收多少空间则由固件工程师自己定义。
这种磨损的弊端在于:当执行垃圾回收时,写入请求会被延迟,每次需要执行回收的Block数量越多,延迟的时间就越长,外在表现为写入性能急速下降。
主动回收策略则是利用系统空闲时间执行垃圾回收,通过固件设定周期性任务,定时检查可用块的剩余情况,如有需要就执行垃圾回收。主动回收策略等同于利用空闲时间提前进行垃圾回收,避免了被动策略所造成的性能波动。
单一利用系统空闲时间执行主动垃圾回收同样存在弊端,假设系统一直没有空闲时间,垃圾回收同样无法有效执行,例如:城市道路视频监控,闪存会一直有文件写入,此种情形下垃圾回收与被动策略基本雷同。
兵哥的卖点1:PR-Latency技术
在主动回收策略中采用更加优化的方式,不是等到系统完全空闲,而是忙里偷闲在命令之间的等待时间零敲碎打的进行垃圾回收。
个人以为,也许兵哥主打的军工和工控市场,有时对Latency要求没有那么高,那么固件在需要的时候,也许可以让让命令回复不要那么及时,从而给GC更多的碎片时间。
兵哥的卖点2:根据不同的应用场景,动态调整的OP空间
这样可以使SSD即使在100%写/读负荷的情况下都可以保持同样的性能,使用IOMeter 设置2MB pattern,100%写模式进行不间断的测试,一周后直接测试性能曲线,仍然可以表现为一条直线。
兵哥真正的卖点:Non-Blance磨损平衡算法
目前垃圾回收算法基本都是围绕如何更加平均的擦除每个Block这种思想进行设计,这些算法是基于Block耐磨度完全一致的”假设”基础之上,但事实上,每个page和Block的耐磨状态是不同的,当对一个闪存上的所有Block进行平均擦除时,必然会有一些Block先成为Bad Block,而另一些Block则会有更长时间的耐磨度。这是由晶圆设计工艺所决定的,在目前的工艺条件下,尚无法确保每个Block完全一致,甚至在生产过程中一定会有晶圆存在一些错误,不可控制的是这些错误是随机分布的。
兵哥使用型号为JS29F16B08CCME2的Intel 16GB MLC NAND Flash做了实验:
进过10次P/E后的情形,结果显示每个Block的Erase时间是不同的,不同的操作时间反应了每个Block的原始状态不同,操作时间短的Block健康状态理论上好于操作时间长的Block。
如果每个Block的耐磨度本来是不均衡的,人为通过算法保持每个Block擦除一致的结果,不是延长了闪存整体寿命,恰恰是损害了闪存最佳使用寿命。
Non-Balance算法思想是:能者多劳。打破前人假设”每个Block寿命一致”基础上的平衡算法,在使用过程中对每个page和Block真实耐磨度进行评估,让耐磨度强的Block得到更多的擦写次数,而耐磨度差的则得到相应的保护。只有每个Block都不成为坏块,才能最大程度上减少对每个Block的擦除次数,举例来说:100个Block写入1TB数据和1000个Block写入1TB数据,假设100个Block写入1TB数据需要被擦除10次,那么,1000个Block只需要被擦除1次。
Non-Balance算法的另一个精要是:当Block的不可纠正误码率(UBER,Uncorrectable Bit Error Rate)达到一定的阈值时,将MLC模式转自动换为SLC模式。
要实现能者多劳,前提是了解Page的真实能力(PE Cycle),而非直接使用Flash厂商提供的标准数据。怎么实现的?且听下回分解。