SSD学习小结(三)FTL
FTL是SSD固件的核心组成。
FTL是Flash Translation Layer(闪存转换层)的缩写,完成主机(或者用户,Host)逻辑地址空间到闪存(Flash)物理地址空间的翻译(Translation),或者说映射(Mapping)。SSD每把一笔用户逻辑数据写入闪存地址空间,便记录下该逻辑地址到物理地址的映射关系。当主机想读取该数据时,SSD便会根据这个映射,从闪存读取这笔数据然后返回给用户。
由于闪存的特性,Block不能覆盖写,需要先擦除才能写入,当写入一个新数据时,不能直接在老地方改写,(闪存不允许在一个闪存页(Page)上重复写入,一次擦除只能写入一次),必须写到一个新的位置。SSD的FW(firmware固件)会维护一张逻辑地址->物理地址转换的映射表。 往一个新的位置写入数据,则原有老位置上的数据会被标记为无效,这些数据自然就变成了垃圾数据。
垃圾回收:垃圾数据会占用闪存空间,当闪存可用空间不够时,FTL需要做垃圾回收,即把若干个闪存块上的有效数据搬出,写到某个新的闪存块,然后把这些之前的闪存块擦除,得到可用的闪存块。
FTL分为Host Based(基于主机)和Device Based(基于设备)。Host Based表示的是,FTL是在Host(主机)端实现的,用的是自己计算机的CPU和内存资源。
Device Based表示的是,FTL是在Device(设备)端实现的,用的是SSD上的控制器和RAM资源。目前主流的SSD中的FTL都是在设备端实现的。
垃圾回收
垃圾回收就是把某个闪存块上的有效数据(下图中的浅色方块)读出来,重新写入,然后把该闪存块擦除,就可以得到新的可用的闪存块。
上图中Block x上面有效数据为A、B、C, Block y上面有效数据为D、E、F、G,其余方块为无效数据。垃圾回收机制就是先找一个可用Block z,然后把Blockx和Block y的有效数据搬移到Block z上面去,这样Block x和Block y上面就没有任何有效数据,可以擦除变成两个可用的闪存块
擦除垃圾数据块得到可用数据块:
为什么SSD的随机写比较慢?
从上面描述的垃圾回收看,如果用户是顺序写,垃圾数据块会比较集中,有利于SSD做垃圾回收;但是如果是随机写的话,产生的无效数据块比较分散,SSD做垃圾回收相对就更慢。因此,SSD的GC性能跟用户写入数据的模式(随机写还是顺序写)也是密切相关的。
写放大
由于GC的存在和闪存块本身的特性,Block不能覆盖写,往往导致SSD往闪存中写入的数据量比用户要写入SSD的数据量多。SSD中一个重要参数就是写放大:
写放大越大,意味着额外写入闪存的数据越多,一方面磨损闪存,减少SSD寿命,另一方面,写入这些额外数据会占用底层闪存带宽,影响SSD性能。因此,SSD设计的一个目标是让WA尽量小。减小写放大,可以使用前面提到的压缩办法(主控决定),顺序写也可以减小写放大(垃圾集中,但顺序写可遇不可求,取决于用户Workload),还有就是增大OP(预留空间)。
OP越大,每个闪存块有效数据越少,垃圾越多,因此需要重写更少的数据,写放大也越小
OP大小对写放大和耐写度的影响
垃圾回收简单分为三步:
(1) 挑选源闪存块
(2) 从源闪存块中找到有效数据
(3) 把有效数据写入到目标闪存块
挑选源闪存块,一个常见的算法就是挑选有效数据最小的块。方法是通过固件i写用户数据时,记录和维护每个用户闪存块的有效数据量。即用户每往一个新的块上写入一笔用户数据,该闪存块上的有效数据数就+1,同时这个数据之前所在的块,有效数据量-1。
这样在GC的时候可以快速找到有效数据最少的那个块,挑选有效数据最少的那个块作为源闪存块,这种BPA算法叫作Greedy算法,是绝大多数SSD采用的一种策略。