垃圾回收的概念其实是很简单的,太多了资料可以看看就会明白,主要的经典算法就是Greedy policy,Cost-benefit policy, Cost-Age-Times(CAT)policy。这里我就简单说一下需要掌握的几个关键性概念:
1、预留空间 OP(Over Provisioning) 和 WAF(Write Amplification Factor)
由于WAF的大小和copy 有效数据有关,想要减少WAF的值出发点是减少copy。
2、掌握垃圾回收,沿着以下线路进行探索
(1)GC的原因:块最终会被写满,必须时刻保证有free page 来满足新的写入需求
(2)GC的过程:When to GC 什么时候唤醒GC操作->
Which block选择作为victim block, 这里的选择方法就是上述提到的经典
算法以及改进->
How many blocks将要被erase 擦除,只要涉及到擦除,就会和磨损平衡
有关->
How to 写回这些有效数据,Where to 分配这些有效数据,这里称之为
Data redistribution policy数据再分配策略
Where 来分配新请求写入的数据
想要改进GC的算法,最基本的简单的就是按照上述来思考。
现如今的都是在经典算法上进行改良。我在学习的时候做过三种算法的模拟,后来自己加了一个Two-block Policy 来实现block再分配,做了一个简简单单的改良,WAF写放大,以及copy次数显著减少。就是有两类block,一类是host write block, 写入的是从host发来的新数据;另一类是copy write block,写入的是victim block上的有效数据。Z这样简单的分类对后续学习磨损平衡很有帮助。包括那些经常更新的数据还有不经常更新的数据怎么来做处理都是学习和思考的点。
对Wear Leveling 磨损平衡的认知:
在写数据操作不断更新的情况下,使得物理闪存块的擦除操作频繁发生,而每一个块上的擦除操作次数不是无限的,是有一定寿命的,也就是经常看到的Program/Erase Cycle 来衡量闪存的寿命。一个block擦除次数到达了一定的阈值,会使得这个块报废,降低闪存的寿命。磨损平衡的出发点是不能一直让那几个块一直不断的erase,应该让所有的block平摊这个任务,最好的理想状态就是每个block的擦除次数是平均的,达到平衡的效果,以此来延长闪存的寿命。
拿一张纸记笔记来说,如果不断的更改内容在一处,不断的用橡皮擦erase,用不了几次,这里就会破掉,因此每次擦除尽量在整张纸上找刚擦一两次的,这会延长纸张整体寿命。
关于闪存的预期寿命:
这个overhead是指文件系统和闪存管理数据结构的开销。
在看了很多论文以及材料的时候以下是常常会接触到的概念:
在研究磨损平衡的时候把擦除次数Erase Counts多的块称之为old blocks,这类块年岁已高,寿命即将到达尾声,因此尽量不要让他们再经受擦除的折磨来长命百岁,任务就给那些擦出次数少的块成为young block,年轻力壮,可以帮老人们多多承担擦除的任务。
前面有提到,擦除是由于用户写入数据不断更新而造成的,那些不断更新的数据称之为hot data,具有high locality,相对比,不常更新的称之为cold data。
在研究了经典的CAT垃圾回收算法时,因为Copy的有效数据可以是cold data 也可以是hot data,而不断更新的新的请求数据,那些也可以是cold data和hot data,那么怎样处理这些数据,怎么样分配闪存的 物理块,能够减少copy的次数,能够延长闪存的寿命,这里就会启发很多想法。
磨损平衡分为动态和静态两种:
动态磨损平衡:主要特点是下一次写数据选择那些擦除次数少的即young blocks来写,但是那些存放cold data的块的擦除次数是比存放hot data的少很多的,因此尽可能的把hot data 写进young blocks上,但是cold data不能一直占用擦出次数少的块,会造成失衡,因此需要静态磨损平衡,冷热数据的分离对性能影响很大。
静态磨损平衡:主要做的就是追踪所有的好块,把cold data从young blocks里面copy 到 older blocks中,这样可以让young blocks歇一歇。我们要记得磨损平衡不是为了减少copy次数,而是为了延闪存的寿命。
二者的比较动态磨损平衡是低成本并且降低静态磨损平衡的复杂度,静态磨损平衡是最大化的延长了寿命,所以要将二者结合。
磨损平衡的终极目标就是:
Hot data -> young blocks
Cold data -> old blocks
Hot-Cold Swapping 技术
核心算法(结合CAT垃圾回收算法):
- 每个block都记录着对应的擦出次数
- 定期检查所有块的擦出次数,这个激活期成为AP(Activation Period)
- 只要任何两个块的擦除次数之间的最大差异大于阈值,它们就会被交换
由于磨损平衡,会带来的性能开销会使得WAF增大。