理解SSD核心技术FTL
Flash的基本操作
不同于HDD,Flash的基本操作除了读和写,还包括擦除操作。这三种操作的具体表现是:读操作以page为单位读取存储单元中的0或1,写操作以page为单位将存储单元从1变成0,擦除以block为单位将存储单元从0变成1(一个block包含若干个page)。
所以在SSD中三种操作的速度关系是:擦除操作 < 写操作 < 读操作。
在一个page中,除了data area,还包括一个叫Out-Of-Band area(OOB)的部分,这部分记录了这个page的相关信息,包括ECC、逻辑页号(LPN)、页状态。
页状态包括:valid,invalid,erased/free。
- 当页没有存储数据时,状态是erased;
- 写操作的对象只能是erased页,写入数据后,这个页的状态就变成了valid;
- 异地更新后,存储了旧(脏)数据的页的状态变成invalid。
Flash的特性
- 读写操作速度不对称,擦除操作 < 写操作 < 读操作;
- 异地更新
就地更新开销大,主要操作包括:1)读取整个block到缓冲区; 2) 更新部分页; 3) 擦除整个block; 4) 把整个block写回到Flash。
异地更新的主要操作包括:1) 标记更新的页为invalid;2) 向erased页写入新的数据。这也就需要记录逻辑页和物理页的映射关系,这部分由Flash Trabslation Layer (FTL)完成。 - 需要GC。异地更新导致部分页invalid,需要GC回收这些invalid。GC操作先将选中的victim block中的valid全部迁移到一个erased block,然后对victim block执行擦除操作。
- 磨损均衡(wear-leveling)。Flash的存储单元寿命有限,持续对某些存储单元擦写(Program/Erase),会加速这部分单元损坏。执行磨损均衡的独立会影响性能,粒度越小,会导致磨损越均匀,但是带来的开销也越大,所以在粒度和性能之间存在trade-off。
SSD的FTL
大部分SSD的存储介质是NAND flash,所以也就需要FTL模块。FTL的主要工作是将面向用户的逻辑页映射到具体物理页,根据映射粒度大小不同,可以分为页映射、块映射和混合映射。
- 页映射:
页映射将每一个逻辑页映射到每一个物理页,映射关系如图1(a)所示,FTL从块设备的上层(如文件系统层)接收到LPN(logic page number),通过映射表获取到PPN(physical page number),然后将这个PPN分成PBN(physical block number)和块内偏移offset,拿着PBN和offset即可寻址到对应的页面。 - 块映射:
块映射将每一个逻辑块映射到每一个物理块,映射关系如图1(b)所示,FTL从块设备的上层接受到LPN,将这个LPN分成LBN和offset,通过映射表将LBN转换成对应的PBN,拿着PBN和offset即可寻址到对应的页面。块映射的基本原理就是组映射,也就是块中的页面都是连续的,假如不是连续的,那也就不可能通过offset寻址到目的页面。
图 1
- 混合映射:
页映射的优点是效率高,直接通过映射表就能将LPN转换成PPN,获取到对应的页,但是缺点是要为每一个page维护一个映射条目,例如512GB的SSD和2KB的page,就需要256MB的映射表。
块映射的映射表占用空间较小,同上面的例子,512GB的SSD和2KB的page,一个block包含512个page,所以仅需要512KB的映射表。但是块映射的灵活性差,例如对某个block中的第p个page更新,就需要找到另一个blcok,并且该block的page是erased,这会降低到目的block的概率,并且降低性能。
为中和页映射和块映射的优缺点,提出混合映射的结构。以前SSD采用如图2的混合映射,即将Flash中的block分成Data Block和 Log Block,前置采用块映射记录全量的数据,后者采用页映射记录增量的数据。GC的时候就将Data Block和Log Block合并。
现代SSD广泛使用DFTL,DFTL的核心思想是利用局部性原理,将可能访问的映射条目放在SRAM,全量的映射条目放在Flash,所以其性能与命中率密切相关。
参考:
【1】DFTL: A Flash Translation Layer Employing Demand-based Selective Caching of Page-level Address Mappings