本文发表于FAST 2022,探讨日志结构文件系统层面的事务支持。本文主要对F2FS进行了支持事务的修改,实现了支持ACID事务特性的文件系统层面支持。本文通过实验测试了SQLite和ROCKSDB在支持事务的日志结构文件系统上的运行效率,结果显示本文实现的事务支持可以简化应用编程复杂度,显著提高应用性能。
01 背景及动机
目前的应用程序在运行涉及多个文件修改的事务时对于系统的冲突一致性有很高的要求。但是由于在文件系统层面的事务支持的缺失,现在的应用必须在上层使用复杂的协议来保证事务在涉及多个文件的更新操作时的一致性,从而引入了更多的写请求和同步命令,对于应用的运行性能会造成很大影响。
当前的事务支持非常有限,部分解决方案只能满足事务ACID(原子性、一致性、孤立性、持久性)的部分特性,一些方法以牺牲应用性能为代价来支持事务的全部特性,还有一些方案依赖硬件上的配合来实现事务的支持,因此本文想要实现一种不对性能产生影响,也不需要底层硬件配合的操作系统层面的事务支持。
02 exF2FS的设计及实现
本文定义了事务性日志结构文件系统应该满足的三条限制并在F2FS中进行了逐个实现:
1. Membership-Oriented Transaction
a)功能解释:文件系统支持每个事务可以涉及多个文件的修改,而不局限于在一个事务中只能进行一个事务的修改。
b)实现方法:在内核中新定义一个事务文件组的对象,对一个事务涉及的所有文件和脏页进行管理,具体架构如下图所示
新定义了一个内核实体:事务文件组,包含一个事务涉及的所有需要修改的文件、需要写回的脏页(数据页+结点页),用于优化页面写回和垃圾回收的块重定位记录的链表和用于事务持久化的主提交块。
exF2FS通过事务文件组这个对象,应用可以指定需要包含在一个事务中的文件,从而支持可以涉及多个文件的修改的事务。
2. Stealing enabled Transaction
a)功能解释:允许未提交事务的脏页的写回,可以用比较小的内存占用实现涉及数据量比较大的事务。
b)实现方法:
i.延迟被写回的页面的非法化,防止垃圾回收将旧位置的数据删除;
ii.将涉及未提交事务的节点页保留在内存中,进行标记防止检查点在事务提交之前将其持久化。
3. Shadow Garbage Collection
a)功能解释:垃圾回收模块可以透明地迁移选中的回收块,对进行中的事务不会造成任何影响。
b)实现方法:保留一块专门的页缓存区域用于与事务相关的页面的垃圾回收,同时针对选中的被回收块类型的不同采用不同的回收策略。
03 实验评估
1. 设备IO请求次数的减少
从实验结果可以看出,原始的F2FS支持的SQLite事务在进行执行三条插入操作的事务时会引入32次写请求和15次的同步请求,整个事务的执行时间需要耗时55ms;而对于优化后的exF2FS,其产生的写请求只有三次,且事务的执行时间缩短到了1.6ms,在执行时间和请求次数的减少上体现出了很明显的优化效果。
2. 吞吐量的提升
以执行插入操作为例,exF2FS的事务执行的吞吐量可以达到原始F2FS在持久化日志模式(图中F2FS PERSISTENT)下的24倍。
3. 每个事务产生的写量的减少
在全部的六种事务支持方法中,exF2FS产生了最少的总写量,与原始F2FS在持久化日志模式的事务支持相比,exF2FS的多文件事务的写量可以减少5/6.
04 总结
这项工作成功地解决了日志结构文件系统中事务支持的三个主要问题:多文件支持、内存占用的节省和透明垃圾回收。使用本文提出的事务日志结构文件系统,我们可以大大简化应用程序编程,并可以在包括 SQLite、RocksDB 和应用程序安装在内的许多流行应用程序中显着提高应用程序性能。
审核编辑:汤梓红
全部0条评论
快来发表一下你的评论吧 !