XSKY解读FAST'20 论文 How to Copy File 《关于如何高效率的对文件目录树进行快速克隆操作》
01导读
这篇发表于FAST20会议的论文,是关于如何高效率的对文件目录树进行快速克隆操作,由来自北卡罗来纳大学教堂山分校的Yang Zhan,Yizheng Jiao以及 罗格斯大学,佩斯大学,石溪大学,VMWare研究中心的相关研究人员合作开发完成的。
本文并非是这篇论文的完整翻译稿,只是对里面的一些重点内容进行解读,有些地方解读不一定准确,建议感兴趣的同学结合原版论文一起阅读,以帮助大家拓宽思路。
文章中所用图表,除非特别注明,都来自于原版论文。
02概述
作者在一开始先介绍了快速克隆的背景和重要性。随着虚拟化的广为流行,各种应用对快速克隆都有着很强的需求,典型的,如快速创建虚拟机,就需要快速克隆出虚拟机的"root filesystem"即一个image磁盘文件。而在容器场景下,如docker会非常频繁的对一个特定的文件系统目录树进行快速拷贝,这些都需要高效的克隆机制。
针对于这些应用场景,现有的文件系统已经实现了一些"逻辑拷贝"功能,有别于"物理拷贝",逻辑拷贝一般在实现时只进行一些元数据级别的拷贝,而只有在后续的修改中,才按需对文件数据进行拷贝并修改,这种功能称作COW(copy-on-write),这种方法在拷贝的时效性和空间的利用率方面都得到了较大的提升,因此现在已经成为克隆的基础技术。在实现时,一般存在着基于block粒度的COW和基于file或者dir级别的COW,比如btrfs和xfs使用的cp –reflink技术。
这里作者指出,对于经典的COW技术,主要存在着"拷贝粒度"的问题,比如对于基于file级别的COW,一次微小的修改就可能导致昂贵的拷贝,比如1G大小的文件,只修改其中的1个字节,也会触发1G文件的拷贝。这会极大的增加初次COW写入时延,而且也不可避免的造成了空间上的浪费。反之,如果拷贝粒度过小,则初次COW写入时延有保证,但却容易造成碎片化(想象一下1个很大的文件,4K拷贝粒度,随机写入则会造成很多个4K COW块),后续顺序读的时候,因为这些4K数据并不是连续的,则读取速度会很慢。因此这里作者提出了自己对高效克隆的看法,需要满足如下4个特性才能被称作是合格的,作者称为"Nimble clones (敏捷克隆)"
· 必须能快速的完成克隆操作。
· 必须有良好的read locality (读取局部性),这样逻辑上相关的文件集读取起来会比较快,同时经过COW后,性能也应该保持一致。
· 必须有良好的写性能,不管是对克隆前的文件集和克隆后的文件集进行写入。
· 空间利用率必须要好。写放大应该尽量保持比较低的水平。
作者在图1举例了现有的几种支持COW文件系统在多次克隆操作并且修改其中一小部分内容后,使用grep查询文件内容的衰减情况:
从图中可以看出,在每次克隆和修改之后,读性能都会衰减。看XFS和ZFS的结果,16轮后大概有3~5倍的衰减。Btrfs表现的好一些,大概只有50%的衰减。总体来看,这几个文件系统都出现性能单调递减的特征。
因此作者认为,这里的关键之处是应该将COW中的copy和write的大小进行解耦,即不应该使用一样的大小,如果是进行大的文件修改,那copy大块然后再覆盖写大块当然是合理的,但是如果是微小的修改,显然,应该将这次微小修改暂存起来,让多次微小修改进行聚合,在达到一定数量后,再批量处理显然会更合理一些。
这篇论文在现有的BetrFS基础上,实现了一种高效的克隆机制,以同时满足前述的Nimble clones需要具备的特征。作者引入了称作CAW(Copy-on-Abundant-Write)的技术,以暂存微小数据修改,等合适的时机再进行COW。另外,这篇论文在3方面对原来的Bε-tree数据结构进行了改进与增强,1.将原来的Bε-tree树结构改造成Bε-DAG结构(directed acyclic graph,有向无环图),以满足对整棵树进行更好的遍历。2.引入了GOTO message,可以快速的持久化克隆操作。3.引入"translation prefix(前缀转换)",用来满足对"延后数据拷贝"和 部分共享数据的查询。在引入这些优化和改进后,实验结果显示,对不同的模型,至少有33%到6.8倍的性能提升。
论文的贡献点归结为:
· 设计和实现了Bε-DAG数据结构,作为Nimble clones的基础。该方法扩展了Bε-tree,用来聚集小的修改,再择机进行批量写入。
· 写优化的克隆实现。在进行克隆操作时,仅需简单的向DAG root节点写入一个GOTO message消息。
· 量化的渐进分析表明,增加克隆不会影响其它的操作。克隆算法开销是对数级别的。
· 全面的测试表明,优化过的BetrFS并没有对原来的BetrFS基线产生不利的影响,而在clone特性上,对比传统的支持克隆特性的文件系统,在性能上有3-4倍的提高,而对比不支持克隆特性的文件系统,则有2个数量级的提高。
03BetrFS背景知识
为深入理解这篇论文,需要先理解BetrFS的背景知识。BetrFS是该团队开发的一个用于研究型的文件系统,从2015年到现在,作者团队已经基于该文件系统发布了多篇论文,详情请参考BetrFS官网。
BetrFS是一个内核态的基于KV存储的本地文件系统。不同于传统的文件系统,如XFS,Ext4,这些文件系统都是基于inode和B-tree(或B-tree变体)来管理和组织元数据和文件系统数据的。而BetrFS是基于Key-Value的,它有2个KV stores。其中,元数据KV存储的是 文件全路径(fullpath) 到 文件系统元数据(struct stat)的映射。数据KV 存储的是 {fullpath+block number} 到 4K block的映射。