首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

从 NILFS2 看 Log-Structure 文件系统(5)

从 NILFS2 看 Log-Structure 文件系统(5)

再看垃圾收集NILFS2 的垃圾收集由用户态进程 cleanerd 执行。垃圾收集算法的具体执行流程如下。
1)首先,cleanerd 通过每个 segment 的 sufile 得到 segment 的空间使用情况。找到哪些 segment 是 reclaimable 的。具体的信息由 nilfs_suinfo_struct 保存,从中可以得到以下这些信息:
  • Sui_flag: 表示 segment 是何种状态,包括 dirty,active,以及 erroneous。某些状态下的 segment 不适于参与垃圾回收。
  • Sui_lastmod:表示 segment 上次修改的时间。垃圾收集一般会选择收集比较老的 segment,和 Java 中的分代收集是同样的理由,往往较年轻的数据更可能短期内会被再次读写,因此成为垃圾的可能性较小。
NILFS2 对所有的 segment 的 sufile 信息进行分析,那些 dirty,non-active 并且 lastmod 最老的 segment 成为候选者。
2)进一步筛选步骤一中选出的候选 segment。
用户通过 /etc/nilfs_cleanerd.conf 文件配置垃圾收集参数,此时 cleanerd 读取配置文件中的 nsegments_per_clean 参数,该参数配置用户希望每次垃圾收集中应该处理多少个 segment。按时间排序,定下最终参与垃圾收集的 segment。
3)您已经了解到,每个 segment 都有一个 summary 头,其中保存了该 segment 中所有 log 的信息。Cleanerd 对 segment 中的每个 block 进一步分析其状态。判断该 block 是 dead 还是 live 状态。Live 状态的 block 正在被使用,因此将被拷贝到新的 log 中。
判断 block 是否为 live 有几个条件:
  • 该 block 被某个 snapshot 索引,因此是一个 live 的 block。
  • 该 block 被某个 inode 直接索引,这说明该 block 正在被某个文件使用,因此是一个 live 的 block。
4)在 segment 中还保存了很多的 checkpoint。Checkpoint 和 snapshot 不同,checkpoint 如果已经比较年老,就将被 cleanerd 收集掉。因此在这个步骤中,cleanerd 查询 segment 中的所有 checkpoint,如果其年龄大于用户在 /etc/nilfs_cleanerd.conf 中的配置,便可以回收这些 checkpoint。否则就将该 checkpoint 所指向的 block 拷贝出来。
5)至此,segment 中所有 live 的 block 都被找到,cleanerd 将这些 block 写入新的 log,然后将被清理的 segment 标志为空闲状态,此后 NILFS2 便可以使用这个 segment 追加新的 log 了。
NILFS2 和 journal 日志文件系统的区别Ext3 是一种 journaling file system;NILFS2 是一种 Log-Structured File system。如果您第一次看到这些术语往往以为是同一种技术。Journal 和 Log 在词典上似乎没有区别,都可以翻译为日志。Log 的来源是早期航海者用木头记录航海日志,Journal 则是教堂中每日的记事。到了现代英语中,似乎可以通用。
但实际上 Log Structured File System 和 Journaling File System 是两种不同的技术。之间的区别也非常简单:
Journal 文件系统保存在日志中的只有 metadata,而 Log-structure 文件系统则采用日志记录一切改动,包括 metadata 和数据。
Journal 文件系统的写操作是随机写,而 Log-Structure 文件系统则只追加写。
返回列表