是由IBM公司和fusionio公司合作进行的。
fusionio是最早做SSD厂商
摘要:
作为linux某些版本的默认fs,支持COW,有效的快照和克隆,使用btree,设计目标是支持更多的用例和负载。
几个挑战:
扩展性:在磁盘空间,内存和cpu上可扩展
数据一致性:不能丢失数据,包括checksum,元数据管理,RAID。
多种磁盘:针对ssd和hdd都可以很好的适应,给RAID和条带机制带来了挑战。


挑战:fs的性能依赖于extent的连续性,随着fs age,会造成空间碎片。但因为支持快照和克隆,所以一个extent会根据ref的计数来决定垃圾回收的时机。而多个version同时引用一个extent会导致碎片无法回收的问题。
另外cpu的并行性和COW机制也是不相容的。
btrfs与传统的inplace更新的文件系统比,主要的负载效应是使得写更加sequential,读更加random。
相关文件系统
EXT4,XFS,BTRFS是linux上的三个流行文件系统。COW文件系统包括ZFS和WAFL。
overwrite based filesystem:本地更新的文件系统
BTRFS的思想是来自ReiserFS和COW友好的BTREE。
EXT4:overwrite based fs,用extent管理数据,使用基于树的索引来代表文件和目录。WAL来保证操作原子性。log上使用校验和。快照内部不支持,但是下面的卷管理器提供这个功能。
XFS:1993年为irix 操作系统开发的,2000年移植到linux。设计目标是io线程,磁盘数,文件系统大小方面的高扩展性。overwritebased fs。使用extent的btree来管理磁盘空间。日志来保证元数据操作原子性。不支持快照,也是底部的卷管理器支持。
ReiserFS是通用的linux fs,是BTRFS的架构和设计的灵感来源。使用一棵树来代表整个文件系统而不是森林。使用tail packing减少内部分段。
LFS:引入了log-structured存储概念。主要思想是将所有对磁盘的修改修道大的chunk上。lsmtree这样的结构。
NILFS:是LFS在linux内核中的实现。挑战在于,垃圾回收器如何处理快照。
ZFS:工程设计包括
池化存储,所有磁盘被管理在一个巨大的存储池中,没有单独的卷管理器
blocktree:文件系统逻辑上看着像block的tree,update被执行为COW。所有改变都写在一边,然后再一次原子操作中root被重写志祥change block。
校验和,数据保存在叶子中,内部节点包括指针以及指向节点的检验和
ZFS和BTRFS的区别:
ZFS是基于固定大小的block来分配磁盘的,block有4KB,8KB。。某个大小的block会用完,所以就有ganging的机制,小的block合并,大的block分解。BTRFS中是基于extent来管理,本身就是变长的,但也可能有严重的碎片化问题。
校验和:ZFS的校验和保存在快指针节点中,而BTRFS保存在一个单独的树中。
快照,克隆:ZFS使用出生时间来建立快照,BTRFS使用引用计数机制代替。BTRFS的机制更通用,可以使克隆成为一等公民(能否被再次克隆)
去重:ZFS支持去重,尽管会带来明显的内存开销。BTRFS不支持。
fundamentals
基本的文件系统操作:文件 创建、删除、读写,目录查询、迭代,快照和克隆。特性包括,数据一致性,崩溃恢复性,RAID
术语:page,block,磁盘上和内存中的4KB的连续区域。
extent,连续的磁盘区域,page对齐,长度是page的倍数。
COW:在一个不同的位置创建extent或page的全新版本。数据经历read-modified-write elsewhere。
3.1 COW友好的btree
在标准的b+树上,1.部署top-down更新过程
2.移除叶子链 3.对于空间管理,使用lazy 引用计数
treenode被认为占据正好一个page。

因为多个root同时指向一个内部节点,形成DAG有向无环图,所以使用引用计数来进行垃圾回收。
3.2 checkpoints
文件系统就是3.1节讲到的tree组成的森林构成的。update在内存中积攒,然后作为原子checkpoint写下。checkpoint由单调递增的版本号标识。
3.3 文件系统btree
BTRFS的btree识别三中数据结构,keys,items,blockheaders。

BTRFS的btree内部节点只有key-blockpointer对,叶节点包括item-data数组。
extent是从文件中的逻辑区域映射到磁盘上的物理区域。
3.4 forest
subvolume:一颗子树
extent 分配树:保存磁盘上的空闲空间的映射表,以extentitem的结构分配空间。extentitem中保存extent的引用计数等元数据。
checksum tree:对每个被分配的extent保存checksum item。
chunk and device trees:是处理物理设备的分发层。允许镜像、条带和RAID。
reloc tree:用于涉及到移动extent的特殊操作。处理去碎片化。


4.多设备支持
linux两个设备管理子系统,设备映射DM,和软件RAID子系统MD。
两个子系统的主要概念就是,结合raw 设备,暴露给上层一个虚拟的连续的块空间。
用chunktree和devicetree维护逻辑chunk到物理chunk的映射关系。
RAID,文件系统中添加设备或移除设备后,通用的平衡算法而对用户io造成最小影响。
5.去碎片化和重新分配
碎片化在所有fs中都很严重尤其是COW机制,每次update,即使已经分配空间,也涉及到新的分配。
BTRFS比起LFS,不需要很长的extent,可以用一些小的extent来存储数据和元数据,然而性能会变得很差。
nocow选项,针对某个文件datablock取消COW机制,除非有快照。对那些COW很昂贵的操作很适合,例如,做随机小更新然后顺序scan的数据库负载。
对于比起数据库要求更少的应用,用户可以设置autodefrag mount 选项。系统不断寻找作为好的备选者的文件,并调度他们来去碎片化。为了去除碎片化,文件在下一个checkpoint被读取,COW,重写到磁盘上。
relocate

2977



被折叠的 条评论
为什么被折叠?



