您现在的位置:e-works > 智造书屋 > 书籍列表 > 大话存储Ⅱ——存储系统架构与底层原理极限剖析 > 固态存储介质和固态硬盘

第三章 磁盘大挪移——磁盘原理与技术 详解

第一十零节 固态存储介质和固态硬盘


 

思考
 

 

损坏的Cell将拖累这个Cell所在的整个Page被标记为损坏,因为SSD寻址和IO的最小单位为Page。损坏的Page对应的逻辑地址将被重定向映射到其他完好的预留Page,SSD将这些重定向表保存在ROM中,每次加电均被载入RAM以供随时查询。

    MLC由于器件复杂,其可擦写的寿命比较低,小于10000次。而SLC则高一些,十倍于MLC,小于100000次。这个值是很惊人的,对于某些场合下,有可能一天就可以废掉一大堆Cell/Page,几个月之内当预留Page都被耗尽后,就会废掉整个SSD。这是绝对不能接受的。
写惩罚会大大加速Wear Off,因为写惩罚做了很多无用功,增加了不必要的擦写,这无疑使本来就很严峻的形势雪上加霜。但是对于读操作,理论上每个Cell可以承受高数量级的次数而不会损耗,所以对于读来说,无须担心。

3.10.5  SSD给自己开的五剂良药,药到是否病除

    面对病入膏肓的SSD写入流程设计,是不是无可救药呢?好在SSD开出了五个药方。

    1. 药方1:透支体力,拆东墙补西墙

    为了避免同一个Cell被高频率擦写,SSD有这样一个办法:每次针对某个或者某段逻辑LBA地址的写都写到SSD中的Free Space中,即上一次全盘Erase后从未被写过的Block/Page中,这些Free Space已经被放电,直接写入即可,无须再做Copy On Write的操作了。如果再次遇到针对这个或者这段LBA地址的写操作,那么SSD会再次将待写入的数据重定向写到Free Space中,而将之前这个逻辑地址占用的Page标记为“Garbage”,可以回收再利用。等到Block中一定比例(大部分)的Page都被标记为“Garbage”时,并且存在大批满足条件的Block,SSD会批量回收这些Block,即执行Copy On Write过程,将尚未被标记为“Garbage”的Page复制到RAM Buffer,将所有Page汇集到一起,然后写入一个新Erase的Block,再将所有待回收的Block进行Erase操作,变成了Free Space。SSD这样做就是为了将写操作平衡到所有可能的Block中,降低单位时间内每个Block的擦写次数,从而延长Cell的寿命。

    重定向写的设计可谓是一箭双雕,既解决了Wear Off过快问题,又解决了大倍数写惩罚问题(因为每次写都尽量重定向到Free Space中,无须CoW)。但是,正如上文所述,SSD自己认为的纯Free Space只会越来越少,那么重定向写的几率也就会越来越少,最后降至0,此时大倍数写惩罚无可避免。

    由于Page的逻辑地址对应的物理地址是不断被重定向的,所以SSD内部需要维护一个地址映射表。可以看到这种设计是比较复杂的,需要SSD上的CPU具有一定的能力运行对应的算法程序。这种避免Wear Off过快的重定向算法称为Wear Leveling,即损耗平衡算法。

    Wear Leveling的实现方法随不同厂商而不同,有些以一块大区域为一个平衡范围,有些则完全顺序地写完整个SSD的Free空间,然后再回来顺序地写完整个被回收的Free空间,无限循环直到Free空间为0为止。传统机械硬盘中,逻辑上连续LBA地址同样也是大范围物理连续的,但是对于SSD,逻辑和物理的映射随着使用时间的增长而越来越乱,好在SSD不需要机械寻址,映射关系乱只会影响CPU计算出结果的时间而不会影响数据IO的速度,而CPU运算所耗费的时间与数据IO的时间相比可以忽略不计,所以映射关系再怎么乱也不会对IO的性能有多少影响。