从嘉の小站

Embedded system, Operating system & AI. Reading, Movie & Life.

[译] [NAND Flash] 4. The Flash Translation Layer

[译] [NAND Flash] 4. The Flash Translation Layer

原文链接:https://flashdba.com/2014/09/17/understanding-flash-the-flash-translation-layer/

背景:Flash的数据修改机制采用的策略是,将修改后的数据写到新的page中,而把原本的page标记为invalid,后续对其进行回收。

功能诉求:

  • 将更新后的信息写到新的空page上,并将所有读请求都绑定到新地址;
  • 确保新编程的page均匀分布,以保证flash的损耗是均匀的;
  • 建立一个invalid pages的表格以供后续回收复用。

Flash Translation Layer (FTL)的功能:

  • Logical Block Mapping

逻辑块地址 (logical block address, LBA)使底层系统对高层的服务消费者不可见。在flash中该机制主要用于在更新时,当一个page被标记为invalid后,逻辑块地址可以重新映射到新page。

  • Wear Leveling*(可以重点关注的优化点)

我们预定义了一定数量的flash blocks,每一个block都可以执行一定数量的P/E循环,直至他们寿命到头。很明显,wear leveling算法的目的是均匀分配P/E cycle,以使所有block同时到达极限。

如果系统中所有的block都是定期更新的,那么就不存在问题,因为在page被标记为invalid和进行P/E cycle时,wear leveling会自动发生;但是,如果存在一些cold blocks,例如数据从不会更新的位置,我们就需要采取措施手动对数据进行重定位,否则这些块将永远不会损耗,这就意味着我们实际上在向系统增加写入负荷,并最终增加系统损耗

综上,我们对wear leveling evenly采取得越严苛,则系统损耗越大。但若系统损耗不够均衡,则会产生 hot and cold spots。通常情况下,我们需要对此进行均衡。或者也可以寻求写入均衡。

  • Garbage Collection*(可以重点关注的优化点)

回收不再需要(比如invalid)但尚未擦除的page。我们不能简单地擦除它们,因为在flash中擦除意味着要擦除整个block。所以,我们考虑block中剩余的内容,如果有必要,就将一些active data移动到其他地方。一旦一个block中没有active data了,就可以进行擦除。

问题在于,一个block中可能包含128或256个page,其中许多都包含了active data。我们可能需要耗费很多精力,才能回收少量的invalid pages,并且,和wear leveling类似,移动数据的操作可能反而会影响性能和endurance。所以,有必要寻找一个合适的平衡点。

下一节,我们将对garbage collection机制进行详细探讨。但需要注意一点:如果垃圾填满速度快于清楚速度,将会怎么办?若回收站空间不足,将是一个很严重的问题。我们需要确保这一情况不会发生。 – Write Amplification

可以看到,上述的处理都会导致在flash media中的额外操作。Wear leveling会重定向inactive (cold) pages,从而确保它们和active (hot) pages损耗均衡。Page collection会将某些page移出即将要进行擦除的block。简而言之,由于主机上采取的操作,background中会产生一系列变化——我们称其为foreground。如果你要以foreground的视角看问题,比如一个数据库服务器访问flash内存,那么你不会看到在baceground中发生的操作。

在主机上使用何种操作系统监控工具是没有影响的,你只会看到foreground的I/O操作。这一特征很重要,因为flash的性能和endurance与foreground和background的操作数总和有关。

我们把这一现象称为write amplification,并且可以使用下述公式表示:

Write amplification的值越高,说明系统工作负载越大,这极有可能降低flash的性能和endurance。因此,在测试flash系统时,我们应当监测的不仅是存储系统的工作负载,也应当关注主机(host)工作负载。

FTL在哪里运行?

可以分为两种:host-based FTL(部分或全部功能在主机上运行) & array-based FTL,每种方法都各有优缺点。但是若我们在服务器上运行数据库,那么FTL与成本的相关性将变得非常小。毕竟,数据库服务器中的处理器和core-based licenses代价非常昂贵。在这种情况下,调度部分CPU cycle来管理flash是非常不明智的。

FTL是SSD固态硬盘的软件核心技术。正因为有了FTL,NAND Flash才能被当成硬盘来使用;文件系统才可以直接把SSD当成普通块设备来使用。它决定了一个 SSD 的使用寿命、性能和可靠性。

可供参考的优化点:在有限硬件资源的环境下如何实现 mapping ?如何实现 buffer 的管理?如何实现高效的 Garbage Collection ?如何实现磨损均衡 Wear-leveling ?如何实现 NAND Flash 芯片之间的数据冗余( RAID on Chip )?

其他可供参考的文献: https://wenku.baidu.com/view/fcc35217a216147916112807.html (Intel: Understanding the Flash Translation Layer Specification)

https://www.tuicool.com/articles/ba6rmi 对mapping机制进行了初步探讨

admin

发表评论

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax