BTRFS(一般念成 Butter FS),由 Oracle 于 2007 年公布并进行里的 COW(copy-on-write 式)文件系统。目标是替代 Linuxext3 文件系统,改进 ext3 限制,尤其是单一图片大小限制,总文件系统尺寸限定及其添加文档校验和特性。添加 ext3/4 未支持的一些作用,比如可写的磁盘快照(snapshots),及其支持递归的快照(snapshots of snapshots),内建磁盘阵型(RAID)支持,支持子卷(Subvolumes)的概念,允许线上调节文件系统尺寸。
首先是扩展性 (scalability) 有关的特性,btrfs 最主要的设计目标是应对大型机器对文件系统的扩展性规定。 Extent,B-Tree 和动态 inode 建立等特性确保了 btrfs 在大型机器上仍有优异的表现,其整体性能而不会随着系统容量的提高而减少。
其次是数据一致性 (data integrity) 有关的特性。系统面临不可预料的硬件故障,Btrfs 选用 COW 事务技术来确保文件系统的一致性。 btrfs 还支持 checksum,避免了 silent corrupt 的出现。而传统文件系统将无法做到这一点。
第三是与多设备维护有关的特性。 Btrfs 支持建立快照 (snapshot),和复制 (clone) 。 btrfs 还可以方便的管理多个物理设备,促使传统的卷管理软件变得多余。
最后是其他无法分类的特性。这些特性都是非常先进技术,可以显著提升文件系统的时间 / 空间性能,包含延迟分配,小文件的存放提升,目录索引等。
有关特性
B-Tree
btrfs 文件系统中所有的 metadata 均由 B-Tree 管理。应用 B-Tree 的重要好处在于搜索,**和删除操作都很高效。可以说 B-Tree 是 btrfs 的关键。
一味地炫耀 B-Tree 很好很高效或许并不能让人信服,但假如略微花费一点儿时间看看 ext2/3 中元数据管理的实现方式,就能够衬托出 B-Tree 的优势。
妨碍 ext2/3 扩展性的一个问题来自其目录的组织方式。目录是一种特殊的文档,在 ext2/3 中其内容是一张线形报表。
这种结构在文档数量有限的情形下是比较直观地设计,但随着目录下文档数的提升,查找文件的时间将线性增长。 2003 年,ext3 设计师研发了目录索引技术,解决了这个问题。目录索引使用的算法设计便是 B-Tree 。假如同一目录下文件数超过 2K,inode 里的 i_data 域指向一个特殊的 block 。在该 block 中存放着目录索引 B-Tree 。 B-Tree 的搜索效率高过线性表,
但为同一个元数据设计两种算法设计总是不太雅致。在文件系统中还有很多其他的元数据,用统一的 BTree 管理是非常简单而优美的设计。
Btrfs 内部所有的元数据都采用 BTree 管理,有着良好的扩展性。 btrfs 内部不同的元数据由不同的 Tree 管理。在 superblock 中,有指针指向这些 BTree 的根。
FS Tree 管理资料有关的元数据,如 inode,dir 等; Chunk tree 管理设备,每一个磁盘设备都在 Chunk Tree 中有一个 item ; Extent Tree 管理磁盘空间分配,btrfs 每分配一段磁盘空间,便把该磁盘区域的信息插入到 Extent tree 。查看 Extent Tree 将得到空闲的磁盘空间数据; Tree of tree root 储存许多 BTree 的根节点。例如客户每建立一个快照,btrfs 就会创建一个 FS Tree 。为了管理所有的树,btrfs 选用 Tree of tree root 来保存全部树的根节点; checksum Tree 保存数据块的校验和。
基于 Extent 的文档存储
当代许多文件系统都采用了 extent 取代 block 来管理磁盘。 Extent 就是一些连续的 block,一个 extent 由起始的 block 加上长短开展定义。
Extent 能有效地降低元数据花销。为了进一步了解这种情况,我们还是看看 ext2 里的背面事例。
ext2/3 以 block 为基本要素,将磁盘划分成多个 block 。为了管理磁盘空间,文件系统必须知道哪些 block 是空闲的。 Ext 应用 bitmap 来实现这个目的。 Bitmap 中的每一个 bit 对应磁盘上的一个 block,当相应 block 被分配后,bitmap 里的相应 bit 被设置为 1 。这是很经典也很清晰的一个设计,但遗憾的是当磁盘容积增大时,bitmap 本身所占用的空间也将增大。这就导致了扩展性难题,随着存储设备容量的提升,bitmap 这个元数据所占用的空间也随之增加。而人们希望不管磁盘容积如何增加,元数据不该随着线型提升,这样的设计才具有扩展性。
提升支持
SSD 是固态存储 Solid State Disk 的简称。在过去的几十年中,CPU/RAM 等器件的发展始终遵循着摩尔定律,但硬盘 HDD 的读写速度却一直没有飞越式发展。磁盘 IO 始终是系统性能的瓶颈。
SSD 选用 flash memory 技术,内部没有磁盘磁头等机械装置,读写速度大幅度提升。 flash memory 有一些有别于 HDD 的特性。 flash 在写数据以前必须先实行擦掉操作;其次,flash 对擦掉操作次数有一定的限定,在技术实力下,对同一个数据单元最多能开展约 10 万次擦掉操作,因此,为了增加 flash 的寿命,应该把写操作均值到整个 flash 上。
SSD 在硬件内部微代码中完成了 wear leveling 等遍布写操控的技术,因此系统无须再应用特殊的 MTD 驱动和 FTL 层。尽管 SSD 在硬件方面做了许多努力,但毕竟还是有限。文件系统对于 SSD 的特性做提升不但能提升 SSD 的使用期,而且能提升读写性能。 Btrfs 是少数专门对 SSD 进行优化的文件系统。 btrfs 用户可应用 mount 参数开启对 SSD 的独特提升解决。
Btrfs 的 COW 技术从源头上避免了对同一个物理单元反复写操作。如果用户开启了 SSD 提升选项,btrfs 将于底层的块空间分配策略上进行优化:将数次磁盘空间分配请求汇聚成一个尺寸为 2M 的连续的块。块状持续地址的 IO 可以让干固在 SSD 内部微代码更好的开展读写提升,进而提升 IO 性能。
- END -