分类: LINUX
2014-10-18 15:42:12
原文地址:F2FS文件系统架构与原理分析(六)——块分配与空间管理 作者:登高望远海
在运行时,F2FS在“Main Area”区域管理6个活跃的log,分别是Hot/Warm/Cold node log和Hot/Warm/Cold data logs:
(1) Hot node contains direct node blocks of directories.LFS有两种机制用于空闲空间管理:Threaded log和copy-and-compaction。Copy-and-compaction机制就是log-structured文件系统中常常提到的cleaning操作,Copy-and-compaction机制非常适用于具有非常好的连续写性能的设备,但是该机制的cleaning操作开销对性能影响很大。相反,Threaded log机制的弊端是要承受随机写,但是不需要cleaning过程。F2FS采用混合机制,其中Copy-and-compaction机制是默认采取的机制。但是F2FS会根据文件系统的状态(在没有足够的clean的segments )动态地更改为Threaded log机制。
为了使F2FS与底层的flash存储设备对齐,F2FS在以section为单位的存储单元中分配一个segment,F2FS期望section的大小与FTL中的垃圾回收单元的大小一致。此外,至于FTL中的映射粒度,F2FS尽可能从不同的Zone中分配每个(上述6个)活跃的log的section,因为FTL可以将活跃的log中的数据根据其映射粒度(并行)写到分配的单元中。
F2FS可以在需要的时候(on-demand)或者空闲的时候以后台处理的方式进行clean操作。On-demand cleaning操作是由于没有足够的空闲segments服务VFS调用而触发开启的cleaning操作,后台cleaner由内核线程操作,当系统I/O Idle的时候触发cleaning操作。
F2FS支持两种选择待清理segments的策略:greedy和cost-benefit算法。在greedy算法中,F2FS选择具有最少有效数据块个数的segment;在cost-benefit算法中,F2FS根据segment的年龄以及有效数据个数选择segment,以解决greedy算法中的log block颠簸问题(频繁的cleaning操作,频繁的数据块迁移,极端情况,选中的segment可能在很长一段时间内一直是greedy算法的选择结果)。F2FS对on-demand cleaner采用greedy算法选择待清理的segment,而对于后台cleaner采用cost-benefit算法。
为识别出选中的segment中哪些数据有效,F2FS管理一个bitmap,每一位表示一个数据块的有效性,该bitmap描述了Main Area中所有数据块的数据有效性。
传统文件系统中如果没有剩余空间,直接返回错误就行。而对于Log-structured文件系统则没有这么潇洒地简单返回错误的处理机制,因为没有空闲块并不表示已使用的块上的数据都有效,在clean操作后又会释放出空闲块。通常一个比较有意义的做法是为Log-structured文件系统提供过量的空间,使得总是有空闲的Section用于cleaning操作中的有效数据的拷贝存储。
FTL恰好利用这种方法,提供过量空间用于“cleaning”以及用于替换高度损耗造成的坏块。FTL在内部处理过量空间,因而当F2FS开始用完空间的时候,它本质上放弃了整个log-structured的理念,只是随机地在其可以写入的地方写入数据。但此时,Inode和索引块仍然会仔细认真对待(不是随意写),有少量的过量空间用于它们的写入。但是对于数据只能采取本地更新,或是写入任意能找到的空闲块中。这样,可以预见的是当F2FS变满的时候,性能会下降,这与大多数的文件系统表现一样。
F2FS的一个难处在于F2FS的shapes (即Sections和Zones)需要针对特定的flash设备及其FTL进行设置,而设备的厂商一般都对其FTL如何工作是保密的。F2FS也要求flash设备舒适地具有6个或更多可并行写入的“打开的”区域,这对三星的flash设备来说没有问题,但是对于其他厂商的设备就难说了。如果参数调整的不好(“打开的”区域不能实现并行写入),F2FS的性能可能就会大大下降。