Flash转换层(FTL)是Flash设备驱动的核心构件,除了实现数据块映射外,FTL还实现了管理 Flash 设备的三个最重要的功能,分别是垃圾回收(或垃圾收集)、管理坏块和损耗均衡(有时也叫损益均衡、平均读写)。
坏块管理是实现可靠存储必需的技术,如果Flash不能识别坏块,那么写入坏块的数据的一致性就无法保证。而垃圾回收和损耗均衡则是Flash存储介质的存储容量和存储性能的重要保证,这两个功能对Flash介质的存储性能产生了一个明显的影响就是Flash的介质的写放大效应。
在介绍之前,现补充一个概念——擦除块。
擦除块(Erase Block)——Flash硬件中的进行擦除操作的最小单元,也就是如果要进行擦除操作,最少要擦除一个擦除块的空间大小的数据。NOR Flash的擦除块大小一般为64~128KB;NAND Flash的擦除块大小一般是8~32KB的块进行的。而多数情况下,一个文件系统的数据块大小为4KB,这样也就存在某个擦除块上的每个4KB空间存储的数据可能属于不同的文件的情况。
1 垃圾收集
垃圾收集,也叫垃圾回收,是一个回收包含无效数据的擦除块的过程(该擦除块中包含部分无效数据,无效数据并不是损坏的或者异常的数据,多数情况下它是某个现在有效的数据的历史版本,现在有效的数据在某个时刻之后,也可能会变成无效数据)。回收过程包括将该擦除块中的有效数据移动到新块,然后擦除该块从而使该擦除块变为空闲的可用擦除块。如果文件系统的可用空间较少,那么通常将在后台启动一个线程,执行这一过程(或者根据需要在适当的时候执行)。
2 管理坏块
如果 Flash 操作(例如 Erase)失败,或者 Write 操作无效(通过无效的错误校正代码发现,Error Correction Code,ECC),那么说明出现了坏块。
识别出坏块后,将在 Flash 内部将这些坏块标记到一个坏块表中。对于SSD设备来说,识别出坏块只是坏块管理的一部分,坏块管理还有其他的一些功能,具体操作取决于实际的SSD设备,例如可以通过从一组独立的预留擦除块(不同于普通数据块管理,OS对这一部分的块用户不可见)选择一个正常的擦除块替换识别出的这个坏块来进行处理,保证存储的容量不会因为坏块的出现而降低。坏块管理在某些情况下可以通过一个内部微控制器在硬件中实现,因此对于上层文件系统是透明的。
3 损耗均衡
Flash 设备属于耗损品:在变成坏块以前,可以执行有限次数的反复的 Erase 操作(NAND Flash支持最大100万次擦除,NOR Flash支持最大10万次擦除)。如果某些擦除块频繁擦除,则设备中出现坏块的时刻就会很早到来。损耗均衡算法通过均衡Flash中每个擦除块的擦写次数,能够最大化 Flash 的寿命。损耗均衡有两种形式:动态损耗均衡和静态损耗均衡。
3.1 动态损耗均衡
动态损耗均衡算法的思想是在每次有数据写入的时候,如果有空闲的擦除块,则使用擦除次数最少的擦除块来存放数据;如果没有空闲的擦除块,则需要回收垃圾擦除块再写入数据,那么就选择擦除次数最少的擦除块进行垃圾回收,然后对其进行擦除操作,最后写入数据(应用要求写入的数据与擦除块之中原来的有效数据一起写入)。动态损耗均衡算法通过优先使用空闲块、无空闲块则选最少擦除次数的擦除块进行垃圾回收后写入数据的方法平均使用擦除块,因此,每个擦除块都获得了相同的使用机会。
动态损耗均衡带来了一个对性能影响异常明显的负面效果——写放大,而且由于它的机制是选择具有最小擦除次数的擦除块而不管该块上的有效数据的多少,因而往往产生最大的写放大系数。比如应用程序对某个擦除块(32KB)上的4KB的数据进行了修改,同时系统中已无空闲块的情况下,假设动态损耗均衡的选择结果是数据还是写到原来的擦除块上,那么虽然请求写入的数据只有4KB,然而为了能写入数据,必须要擦除该擦除块,也就是先要将该擦除块上其他有效的28KB的数据读取到内存,然后再擦除整个擦除块,最后将这28KB的数据加上应用程序请求的4KB数据一起写入擦除块,因而实际的写操作的数据是32KB,实际写入的数据量是请求的数据量的8倍,这个过程就是写放大,这个写放大系数就是8。
现在,Intel的SSD磁盘号称他们已经把写放大系数控制到1.05之内了,这对Flash的存储性能来说,尤其是写性能,的确是相当大的提升。
由于写放大现象对性能的影响非常明显,因而现在的动态损均衡的算法在选取回收的垃圾块时,为降低写放大效应,选取擦除块的策略就调整为选取擦除块中有效数据最少的垃圾块进行回收。这也就导致了一个问题的产生——某些具有较多的有效数据的垃圾块始终得不到回收,最终导致擦写不平衡的产生,由此产生了静态损耗均衡机制。
3.2 静态损耗均衡
动态损耗均衡算法在有数据写入的时候激活使用,而静态损耗均衡的算法则可以定期以后台程序执行的方式将擦写次数最少的擦除块中的有效数据移动到新的擦除块。这种算法不仅能均衡擦除块的读写,而且能解决动态损耗均衡算法为降低些放大系数导致部分擦除块始终不被回收的情况的发生。
动态和静态损耗均衡算法在早期的Flash中可能两者只具其一,而现在的Flash存储介质(包括SSD)中,动态损耗均衡和静态损耗均衡算法一般都是同时具备的。如华为的PCIe SSD 卡ES 2000、ES3000系列等,动态与静态损耗均衡都是支持的。