FTL——磨损平衡
作者:互联网
本文章内容来源《深入浅出SSD 固态存储核心技术 原理与实战.pdf》
磨损平衡,就是让SSD中的每个闪存块的磨损(擦除)都保持均衡。
**为什么要做磨损平衡?原因是闪存都是有寿命的,即闪存块有擦写次数限制。一个闪存块,如果其擦写次数超过一定的值,那么该块就变得不那么可靠了,甚至变成坏块不能用了。如果不做磨损平衡,则有可能出现有些闪存块频繁拿来做擦写,这些闪存块很容易就会寿终正寝。随着不断的写人,越来越多的坏块出现,最后导致SSD在保质期前就挂掉。相反,如果让所有闪存块一起来承担,则能经受更多的用户数据写人。
一个闪存块寿命有多长呢?从SLC十几万的擦写次数,到MLC几千的擦写次数,然后到TLC的一两千次甚至几百次擦写次数,随着闪存工艺不断向前推,闪存的寿命越来越短,SSD对磨损平衡的处理要求也越来越高,如图4-38所示。
接下来的问题就是,SSD是怎么做磨损平衡的呢?
在这之前,我们先抛出几个概念:冷数据(Cold Data)和热数据(Hot Data),年老的(Old)块和年轻的(Young)块。
所谓冷数据,就是用户不经常更新的数据,比如用户写人SSD的操作系统数据、只读文件数据、小电影等;相反,热数据就是用户更新频繁的数据。数据的频繁更新,会在SSD内部产生很多垃圾数据(新的数据写人导致老数据失效)。
所谓年老的块,就是擦写次数比较多的闪存块;擦写次数比较少的闪存块,年纪相对小,我们叫它年轻的块。SSD很容易区分年老的块和年轻的块,看它们的EC (Erase Count,擦除次数)就可以了,大的就是老的,小的就是年轻的。
SSD一般有动态磨损平衡(Dynamic WL)和静态磨损平衡(Static WL)**两种算法。
动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。
动态磨损平衡可能相对好理解一些:在写人新数据时,挑选年轻力壮的闪存块,这样就避免了一直往年长的闪存块上写人数据,闪存块的擦写次数能保持一个比较均衡的值。
我们重点来说说静态磨损平衡。
为什么还需要静态磨损平衡?冷数据由于不经常更新,它写在一个或者几个闪存块上后,基本保持不动,这样,这些闪存块的擦写次数就不会增加;相反,对别的闪存块,由于经常拿来写人用户数据,擦写次数是一直增长的。这样就导致闪存块的擦写不均衡,这不是我们期望的。因此,固件需要做静态磨损平衡,把冷数据搬到擦写次数比较多的闪存块上,让那些劳苦功高的年老闪存块休息一下,腾出来的年轻闪存块去替年老的闪存块承受用户数据的写人。
固件具体做静态磨损平衡的时候,一般使用GC机制来做,只不过它挑选源闪存块时,不是挑选有效数据最小的闪存块,而是挑选冷数据所在的闪存块。其他和GC差不多,即读取源闪存块上的有效数据,然后把它写到擦写次数相对大的闪存块上去。
静态磨损平衡可能导致冷数据和热数据混在同一个闪存块上,即冷数据可能跟用户刚写人的数据混在一起,或者冷数据和GC的数据写在一起,或者三者写在一起。
1)SWL数据和用户数据混在一起写在同一个闪存块上,如图4-39所示。
2)SWL数据和GC数据混在一起写在同一个闪存块上,如图4-40所示。
3)三者全都混在一起写在同一个闪存块上,如图4-41所示。
为什么我要提冷热数据混在一起写这个问题?冷热数据混在一起写不好吗?
的确有不好的地方,那就是在做GC的时候,由于冷数据掺杂其中(冷数据由于不经常被用户更改,这些数据往往是有效数据),这些冷数据就可能经常地从一个闪存块搬到另外一个闪存块,然后从另外一个闪存块再搬到别的闪存块上去,长此以往,引人了不少额外的写,导致写放大增大。
有读者要问,那该怎么办?下面提供一种解决方案。
解决办法如图4-42所示,做静态磨损平衡的时候,用专门的闪存块来放冷数据,即不与用户或者GC写入同一个闪存块。这样冷数据就单独写在某些闪存块上,它们一般不会挑选为GC的源闪存块,也就避免了这些冷数据的频繁搬移。它只有在下一次需要做静态磨损平衡的时候,才会从一个闪存块搬到另外一个闪存块。
标签:闪存,磨损,擦写,次数,平衡,数据,FTL 来源: https://blog.csdn.net/weixin_37981492/article/details/120759567