Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1204241
  • 博文数量: 185
  • 博客积分: 495
  • 博客等级: 下士
  • 技术积分: 1418
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-02 15:12
个人简介

治肾虚不含糖,专注内核性能优化二十年。 https://github.com/KnightKu

文章分类

全部博文(185)

文章存档

2019年(1)

2018年(12)

2017年(5)

2016年(23)

2015年(1)

2014年(22)

2013年(82)

2012年(39)

分类: LINUX

2013-11-19 10:57:33

1. 默认块分配

    在运行时,F2FS在“Main Area”区域管理6个活跃的log,分别是Hot/Warm/Cold node log和Hot/Warm/Cold data logs:

(1) Hot node      contains direct node blocks of directories.
(2) Warm node     contains direct node blocks except hot node blocks.
(3) Cold node     contains indirect node blocks
(4) Hot data      contains dentry blocks
(5) Warm data     contains data blocks except hot and cold data blocks
(6) Cold data     contains multimedia data or migrated data blocks
根据数据所属的类型,利用对应的log分配的空间将数据写入该空间。


2. 空闲空间管理

    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中的数据根据其映射粒度(并行)写到分配的单元中。

 

3. Cleaning过程

    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中所有数据块的数据有效性。

 

4. 文件系统空间写满的处理

    传统文件系统中如果没有剩余空间,直接返回错误就行。而对于Log-structured文件系统则没有这么潇洒地简单返回错误的处理机制,因为没有空闲块并不表示已使用的块上的数据都有效,在clean操作后又会释放出空闲块。通常一个比较有意义的做法是为Log-structured文件系统提供过量的空间,使得总是有空闲的Section用于cleaning操作中的有效数据的拷贝存储。

    FTL恰好利用这种方法,提供过量空间用于“cleaning”以及用于替换高度损耗造成的坏块。FTL在内部处理过量空间,因而当F2FS开始用完空间的时候,它本质上放弃了整个log-structured的理念,只是随机地在其可以写入的地方写入数据。但此时,Inode和索引块仍然会仔细认真对待(不是随意写),有少量的过量空间用于它们的写入。但是对于数据只能采取本地更新,或是写入任意能找到的空闲块中。这样,可以预见的是当F2FS变满的时候,性能会下降,这与大多数的文件系统表现一样。


5. 充分利用F2FS

    F2FS的一个难处在于F2FS的shapes (即Sections和Zones)需要针对特定的flash设备及其FTL进行设置,而设备的厂商一般都对其FTL如何工作是保密的。F2FS也要求flash设备舒适地具有6个或更多可并行写入的“打开的”区域,这对三星的flash设备来说没有问题,但是对于其他厂商的设备就难说了。如果参数调整的不好(“打开的”区域不能实现并行写入),F2FS的性能可能就会大大下降。

阅读(1424) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~