NAND寿命受限于擦除次数,对相同的block进行频繁改写和擦除很容易就造成永久性伤害,使SSD寿命下降或性能降低,因此引入WL尽量平均地擦除和写入所有block,以延长SSD寿命。当然太过激进的WL算法也会导致SSD寿命的快速下降。
“SSD data path”这篇文章最后介绍了 page loyout,有记录block id和erase count。另外fw里还有维护一个表ECT(erase count table),每个block的擦除次数都会记录在这个表里。ECT存放在NAND中,SSD上电时在SRAM中维护并定时更新进NAND中。企业级SSD有超级电容或钽电容做掉电保护,这个会另外写文章讲掉电保护。
WL分为动态和静态。
动态WL:是在缓存处理数据,就是说有Write操作时,从空闲block链表里拿ECT最小的block写入,这个block从空闲链表加入到数据块链表,并建立地址映射关系。
从用户层来看,假如每次都是对同一个逻辑地址重复写数据,fw里是会把真实数据存放的物理地址重新建立映射关系。
静态WL:动态WL无法对cold数据进行处理,冷数据就是在NAND中很长时间没有读写操作的数据。
一个触发机制是检测闲置数据超过设定的阈值,然后找出数据块链表中ECT最大和最小的block。
Hot-Cold Swapping:结合GC的CAT算法,每个block记录擦除次数,fw定期检查,如果有2个block擦除次数的差值大于设置的阈值,就会交换。
NAND中也有很多坏块,包括出厂时的硬坏块,还有使用过程中产生的软坏块,在状态寄存器标示后倒出数据,并加入到坏块表里,这些会另外文章里介绍。
Block耐磨度实际上并不是完全一致的,有的TLC block能达到1万次的寿命,有的可能几百次,也有的出厂时就有坏块,单纯的靠擦除次数是不能统计block寿命的。还要看block擦除时耗费的时间,时间越短越健康。还可以通过破坏性PE测试,记录原始误码率/不可纠正误码率/操作时间,建立数学模型。
对每个block和page耐磨度进行评估,耐磨好的多擦除。如果不可纠正误码率(UBER,UncorrectableBit Error Rate)达到阈值,TLC可以转SLC。