👉个人主页: highman110
👉作者简介:一名硬件工程师,持续学习,不断记录,保持思考,输出干货内容
今天继续分享FTL的另一项功能:磨损平衡。
我们知道nand flash的擦写次数是有限的,从SLC十几万的擦写次数,到MLC几千的擦写次数,然后到TLC的一两千次甚至几百次擦写次数,随着闪存工艺不断向前推,闪存的寿命越来越短,而我们在平时的操作中,有可能某个block经常被擦,而有的block则使用的次数很少,所以要有一个机制来确保最好每个block的擦除次数的均衡的,这个机制就是磨损平衡。
在介绍磨损平衡之前,先说几个概念:冷数据(Cold Data)和热数据(Hot Data),年老的(Old)块和年轻的(Young)块。所谓冷数据,就是用户不经常更新的数据,比如用户写入SSD的操作系统数据、只读文件数据等;相反,热数据就是用户更新频繁的数据。数据的频繁更新,会在SSD内部产生很多垃圾数据(新的数据写入导致老数据失效)。所谓年老的块,就是擦写次数比较多的闪存块;擦写次数比较少的闪存块,年纪相对小,我们叫它年轻的块。SSD很容易区分年老的块和年轻的块,看它们的EC(Erase Count,擦除次数)就可以了,大的就是老的,小的就是年轻的。
SSD一般有动态磨损平衡(Dynamic WL)和静态磨损平衡(Static WL)两种算法。动态磨损平衡算法的基本思想是把热数据写到年轻的块上,即在拿一个新的闪存块用来写的时候,挑选擦写次数小的;静态磨损平衡算法基本思想是把冷数据写到年老的块上,即把冷数据搬到擦写次数比较多的闪存块上。
动态磨损平衡机制好理解:在写入新数据时(这时并不知道到新数据是冷数据还是热数据),直接挑选年轻力壮的闪存块,这样就避免了一直往年长的闪存块上写入数据,闪存块的擦写次数能保持一个比较均衡的值。静态磨损平衡怎么理解呢?由于数据在写入时SSD不知道哪些数据是冷数据,哪些数据是热数据,要经过一段时间的使用才能判断出来,举个极端的例子,如果有10个闪存块在第一次写入数据之后再也没有动过,也就是存的冷数据,那这10个闪存块在磨损的角度来看就是很年轻的块,它还可以擦写很多次,所以为了不浪费这些闪存块的擦写次数能力,SSD在后台将这里面的冷数据移动到年老的闪存块里,同时还降低了这些年老闪存块继续被擦的发生几率,所以不仅要有写入时的动态磨损平衡机制,还需要后台的静态静态磨损平衡机制。
固件具体做静态磨损平衡的时候,一般使用GC机制来做,只不过它挑选源闪存块时,不是挑选有效数据最小的闪存块,而是挑选冷数据所在的闪存块。其他和GC差不多,即读取源闪存块上的有效数据,然后把它写到擦写次数相对大的闪存块上去。
磨损平衡机制有可能会导致冷数据和热数据混在一个闪存块上,在做GC的时候,由于冷数据掺杂其中(冷数据由于不经常被用户更改,这些数据往往是有效数据),这些冷数据就可能经常地从一个闪存块搬到另外一个闪存块,然后从另外一个闪存块再搬到别的闪存块上去,长此以往,引入了不少额外的写,导致写放大增大。为了解决此问题,通常做静态磨损平衡的时候,用专门的闪存块来放冷数据,即不与用户或者GC写入同一个闪存块。这样冷数据就单独写在某些闪存块上,它们一般不会挑选为GC的源闪存块,也就避免了这些冷数据的频繁搬移。它只有在下一次需要做静态磨损平衡的时候,才会从一个闪存块搬到另外一个闪存块。
不同的SSD有不同的静态磨损平衡做法。如果不在乎写放大(EC预算够大,不差钱),也不在乎冷数据搬移导致的性能下降,那么冷热数据混在一起就一起,毕竟实现简单(不需要另外管理静态磨损平衡的闪存块);相反,如果对写放大比较敏感的话,那么最好还是冷热数据分开。
文章参考自《深入浅出SSD:固态存储核心技术、原理与实战SSDFans》。