ssd 损耗平衡算法

来源:互联网 发布:淘宝首页广告位价格 编辑:程序博客网 时间:2024/04/28 15:23

       ssd摆脱了机械寻道的怨念,大幅度的提高了IOPS,但是由于它的材料的物理特性和机制,又带来了2个新的问题,1是大量的写惩罚(可擦除的最小扇区尺寸过大),2就是cell(存储位单位的晶体管)在频繁的充电放电过程中氧化失效。因此采用平衡消耗算法,每次写操作都重定向到一个新的cell区域,使其所有的cell均摊写操作,从而延长整体cell的寿命。(说白了就是大家均摊伤害,要死一起死)


下面是详细描述

1 一块ssd在没写过之前,会进行erace操作(全盘cell放电),这时候全盘的page(一个page由多个cell组成,多个page又组成一个block)都处于free状态。

2 这时候有写操作进来了,写操作2种,一种是create区域(create file or append file),还有一种是update区域(update file),目前盘未写过,只有是create区域,ssd会从free区域里取出适合大小的pages来存储数据,倘若以后是update区域,ssd会先把要覆写的那些pages标记为garbage状态,然后再从free区域里取出pages(优先用新block里的page)来存储新数据,然后再把逻辑地址重新定向到新的page

3反复的写操作,会使得garbage page 越来越多,从而组成一个个完整的 garbage block,garbage block到达一定比例的时候,ssd会对这些block做erace操作,使其变成新的free block,简单的说就是合并回收操作

      很明显的看的出free block回收的速度是赶不上free block消耗的速度,其实过不了很久,free block就耗尽了,到时候没有free  block可用,只能分配那些被用过的block里的剩余page,而对于此类block的部分page写操作,目前ssd只能先读出该block原有的有效数据,然后整个block做erace清零,然后再进行充电操作,把新老数据写进去。 看这个描述就知道是个恶心的过程。

有2点解释下    

     为什么修改一个block里的部分数据,要先对里面cells整体进行erace操作,然后再根据具体数据去进行部分充电?

     是因为电流的干扰 
     好比现在5个cell 里面的数据是10101 现在改为01010(1充电 0放电),那么5个cell之间互相充电放电,电流会相互干扰,影响电势,所以干脆全部放电,清零,然后再把要1的位充电即可。
   
    为什么回收要以block作为最小回收对象,而不是page?
    这个充电放电的最小单元有关,ssd的最小单元就是block,不以page作为最小充电对象是因为制作工艺的问题,ssd的page个数和block不是一个数量级的,page去充电 电路和导线太复杂,还做不了那么细。