Linux原生的ext4文件系统目前已经在一些最新的Linux发布版本中包含了,我也使用了一段时间,和ext3相比,有所改善但是不是那种非常显著的干劲,更详细的情况可以参考这篇文章(ext4文件系统:介绍及性能测试)。
不过我一直向往Solaris上的ZFS,觉得那才是真正的企业级文件系统,COW,CDP等功能让人着迷,虽然目前linux上已经有基于fuse的ZFS实现,但是性能上就大打折扣了,直到Btrfs文件系统的出现,让我看到了未来:
Btrfs 承若将赋予这个文件系统许多类似ZFS的企业级特征,甚至在性能和亮点上要超过ZFS。事实上,很多Linux专家认为Btrfs应该是Linux未来的 一个关键点。
不过目前Btrfs目前还没有完全发布,不过相信很快大家就能用到了,在正式使用之前,我们不妨对它做一些了解,甚至可以对其进行一些性能上的测试。
Btrfs文件系统介绍
Btrfs,有时又被称作”Butter FS”(黄油文件系统?),最先由在Oracle工作的Chris Mason发起这个项目,Oracle以GPL协议发布。目前这个项目在Linux社区获得大量的追随者并引起大多数人的共鸣,目前Btrfs有以下特性:
- 写时复制(Copy on Write a.k.a COW)
- 扩展(extents,看和ext4有关文档)
- 针对小文件提升空间效率
- 针对目录索引提升空间效率
- 动态i节点分配
- 可写的快照(writable snapshot)
- 快照的快照(snapshots of snapshots)
- 子卷(subvolumes,根文件系统内部分割)
- 对象级镜像和条带化(object level mirroring and striping)
- 数据和元数据的校验和
- 压缩
- 集成多设备支持,包含几种RAID算法
- 在线文件系统检查和碎片整理
- 非常快速的离线文件系统检查
- 高效的增量备份和文件系统镜像
从以上的特征,你能看出来Btrfs是一个非常有“野心”的项目,当然看了这些特征,估计你会爱死它了(不会像Multics一样不堪重负而死掉吧?) 可能你立刻会问到一个问题,“和ZFS相比如何?”,恩,知道你会问这个问题,因为有人已经有非常长的文章来对此作为比较,我们这里摘录其关键点吧,看下面这张对照表格:
| 特征 | ZFS | BTRFS |
|---|---|---|
| 写时复制 | 是 | 是 |
| 快照 | 是 | 是 |
| 快照的快照 | 不清楚 | 是 |
| 磁盘使用率接近98-100%时,性能受损 | 是 | 差不多是这样 |
| 块级别压缩 | 是 | 当前是作为一个挂载选项 |
| 磁盘加密 | 正在开发 | 已经计划了,但是目前还未进入内核,encryptfs是一个选择 |
| 在线改变文件系统大小 | 否 | 是 |
| 在线碎片整理 | 否 | 是 |
| 写校验和 | 是 | 是 |
| 内建RAID | 是(0,1,10, 5 ) | 是(0, 1, 10) |
| ACL | 是 | 是 |
| 直接IO | 是 | 写可以,读不行–已经计划了 |
| 配额 | 是 | 是 |
特性详解
Btrfs是非常有雄心的一个项目,带来了非常多的新特性,一些非常重要和关键的特性已经在上面的列表中说了,这些特性值得我们深入了解。
动态i节点分配
这个特性听上去不怎么实用,实际上,在创建/扩展文件系统时,它还是很有用的。动态分配意味着当创建文件系统时只有少量的i节点被创建,当i节点不够时,文件系统会非常平滑的创建更多的i节点。想想以前创建一个500G的文件系统时,有多少时间是花在创建i节点上呢?
快照(snapshot)
Btrfs允许你创建文件系统或者文件系统某一个部分的快照,你可以利用这个快照来创建备份,或者在紧急情况下的数据拷贝。
你也可以使用它来将文件系统的某一个部分dump出来作为一个归档(归档后,你可以删除快照和原始数据)。
通常,快照是不会被修改的,因为做快照一般都是用来执行一些比较关键的任务,比如备份、修复、归档等。
但是在某些情况下,你可以需要对快照做一些写的操作,Btrfs允许你这么干
举个例子:假定你对某一个目录做了快照,而后你又在这个目录做了一些工作,只要你能确保这个目录已经更新到快照里,你就可以保持你的拷贝是最新的,这实际上是一个快照的快照,这就是Btrfs一个非常灵活的快照功能(没有明白?等你用了Btrfs,你就明白了)。
写时复制(Copy on Write)
这个术语已经听得很多了,它指的是允许你的某一些数据在写的时候被拷贝(就是做了两次拷贝)。
在Btrfs里,这个技术可以有各种用途。比如Btrfs可以将它和快照甚至快照的快照技术联合起来使用,这样使得数据很容易更新。
Btrfs也可以使用它来记录日至,比如对于日志文件系统,可以对日志或者数据来一个写时复制,这就可以保证数据的高可用性。
子卷(Subvolumes)
Btrfs能够把文件系统的某一部分分离出来挂载,就像是一个独立的文件系统一样。
当你想限制用户访问一个目录中的某一个部分的时候,这个功能就会变得非常有用。
比如,如果在一个主目录里,其中一个子目录希望能被用户访问,而其他部分不允许。
那么这个子目录就可以当作子卷(subvolume)挂载,对用户而言,她就像一个实际的文件系统一样。
多设备支持
当前Linux系统,如果你想创建一个RAID-0或者RAID-1或者其他RAID级别,然后在这些设备用上LVM,你可能需要使用硬件RAID卡或者软RAID(md)来做到把多个设备合成一个虚拟的设备。
而Btrfs则把对多设备(RAID)的支持内嵌到文件系统里了。
当前,Btrfs可以做RAID-0,RAID-1,RAID-10(以后应该会增加系统RAID级别)。
Btrfs一旦被创建,它允许你直接增加设备(磁盘)到这个文件系统里(动态i节点分配是关键),当然也允许你拿走设备。
(哦,天啦,哦,天啦,天啦,这不就是一个磁盘阵列了么?)
文件系统检查和碎片整理增强
文件系统检查(fsck)对系统管理员而言就是一个毒药,因为做文件系统检查,你就需要将文件系统处于offline的状态(在线fsck,你试试,别到时哭都没有地方哭去),然后做fsck操作来修复,这个过程是需要花费大量的时间的,修复完成后,你总算可以重新挂载了(假定你修复出来的文件系统没有问题)。
Btrfs允许你对一个已经挂载而且在使用的文件系统进行在线的文件系统检查。在检查的过程中,你仍然可以使用这个文件系统。
另外,虽然文件系统开发人员尽了最大的努力,但是碎片还是会发生,当然也就会影响性能(想起那个著名的有关windows磁盘碎片整理的笑话来了)。
磁盘碎片整理也需要文件系统处于offline的状态,和fsck差不多,而Btrfs也允许你在在线的时候使用。
加密
文件系统加密变得越来越流行,特别对一些企业和敏感人士的笔记本而言,一旦笔记本被偷或者遇到不良维修人员(想象陈君冠希老师吧),也许你会死的很惨。因此文件系统加密变得很重要了。
Btrfs加入了非常强的加密功能,而且还会提供一些额外的技术(记住:目前这部分还在开发过程中)
压缩
除了加密,Btrfs也提供了压缩来节省空间和提升性能的功能,当前,它使用内核自带的zlib压缩算法。
Btrfs,何时到来?
一旦有新的功能,我们总是想问,我们嘛时候能使用呀?可是新功能总是要经过无数次的测试,调试,开发这样的一个迭代过程,因此不会来的太快的。
目前,内核2.6.29版本已经进入了Btrfs,不过加上了“试验(experimental)”的标签,这当然是Linux一贯的做法,可以获得更广泛的测试以及问题反馈。
你可以升级到这个核心,并订阅Btrfs的开发邮件列表,为Btrfs的早日杀青作出你的贡献吧。
创建Btrfs文件系统和测试
说了这么多,都是干说,现在我们来点实际的,下面给出一个完整的Btrfs文件系统创建和测试的步骤,让大家过足瘾吧。
故事从下面的指令开始:%mkfs.btrfs /dev/sda1 它发生的太快了,连你想掐秒表计算时间的机会都没有。OK,来个脚本测试一把吧:
[root@test64 ~]# ./test.sh
Sat Apr 18 15:47:50 EDT 2009
WARNING! - Btrfs Btrfs v0.18 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using
fs created label (null) on /dev/sda1
nodesize 4096 leafsize 4096 sectorsize 4096 size 465.76GB
Btrfs Btrfs v0.18
Sat Apr 18 15:47:51 EDT 2009
不要不相信自己的眼睛,没错,465G的文件系统创建只要1秒钟,这就是i节点动态分配的直接结果。你可以用创建ext3文件系统来作为一个对比(当然,ext4已经支持i节点动态分配了)
创建完后,挂载当然是一件很简单的事情了。
%mount -t btrfs /dev/sda1 /mnt/data_btrfs
在多个设备上创建文件系统也很简单,缺省情况下,在在多个设备上创建Btrfs 文件系统是,元数据(metadata)会在每一个设备上做一个镜像(类似RAID1)。而数据而采取条带模式(类似RAID0)。当然Btrfs 也允许你改变元数据存储的方式,它支持下面的方式:
- RAID-0 (元数据在每一个设备上都会有)
- RAID-1 (元数据在每一个设备上都镜像)
- RAID-10 (元数据在每一个设备上都有,而且相互镜像)
- single (元数据存在单个设备上)
下面是在多个设备上创建Btrfs的例子:
% mkfs.btrfs /dev/sda1 /dev/sdb1
现在你可以使用/dev/sda1或者/dev/sdb1挂载。创建多设备的文件系统并不比创建单个设备的文件系统要慢。
性能测试
性能测试有很多,这里我们选择iozone工具,关于iozone的相关说明和用户可以参考官方文档。测试环境是AMD Opteron64 CPU 2.0GHz,CentOS 5.3,Btrfs v0.18,kernel 2.6.30-rc1
我们会针对单个磁盘和两个磁盘分别进行测试,对于挂载选项,我们可以选择了缺省(标准)挂载方式和以下的挂载参数:
- nodatacow (无写时复制)
- nodatasum (无数据校验)
- compress (打开数据压缩)
下面的测试结果表有4列:write,rewrite,read,reread。
作为对比,我们选择了ext3(default),ext4(default),ext3(performance),ext4(performance)最为测试比较对象。
详细情况请看下表:
options |
MB/s |
MB/s |
MB/s |
MB/s |
||
|---|---|---|---|---|---|---|
| 28.307 | 28.001 | 55.791 | 55.765 | |||
| 30.228 | 29.626 | 108.701 | 108.884 | |||
| 28.047 | 26.432 | 105.565 | 105.156 | |||
| 30.127 | 29.365 | 109.889 | 109.600 | |||
| 31.586 | 31.917 | 104.104 | 104.106 | |||
nodatasum |
31.933 | 31.839 | 107.157 | 106.565 | ||
| 31.513 | 31.504 | 105.578 | 105.828 | |||
nodatasum |
31.874 | 31.896 | 105.109 | 106.565 | ||
| 71.359 | 71.129 | 126.660 | 132.314 | |||
raid0 |
49.891 | 50.318 | 129.907 | 132.024 | ||
raid0 |
nodatasum |
45.054 | 45.867 | 130.655 | 131.879 | |
single |
50.144 | 50.264 | 126.984 | 131.130 | ||
single |
nodatasum |
43.834 | 47.603 | 131.612 | 131.470 | |
raid1 |
48.984 | 50.388 | 122.818 | 109.867 | ||
raid1 |
nodatasum |
48.196 | 48.462 | 131.832 | 131.807 | |
raid10 |
49.859 | 50.101 | 130.655 | 132.179 | ||
raid10 |
nodatasum |
50.072 | 50.366 | 129.424 | 122.828 | |
| 70.241 | 69.299 | 138.849 | 127.958 | |||
nodatacow, nodatasum |
31.976 | 31.922 | 107.000 | 106.728 | ||
raid0 |
70.234 | 69.048 | 130.852 | 129928 | ||
raid0 |
nodatacow, nodatasum |
48.762 | 48.831 | 130.812 | 130.202 | |
raid1 |
70.467 | 68.286 | 130.990 | 130.051 | ||
raid10 |
70.900 | 69.926 | 130.812 | 130.202 |
性能测试结果分析
从上面的测试结果,我们可以获得以下一些结论:
- Btrfs的缺省挂载方式获得了和ext4相近的性能,相比ext3要好很多了
- 关闭数据校验和写时复制功能,性能有了显著提高,牺牲了数据的而外保护当然要在性能上获得补偿嘛
- 打开压缩选项后,性能相比标准挂载有了很大的提升,write和rewrite差不多提升了100%,而read和reread性能提升了30%的样子。
- 使用两块磁盘时,通用write和rewrite性能提升50%,write和rewrite性能提升30%。有意思的是,带压缩的单个磁盘write和rewrite性能比两个磁盘的性能要高。而且,带压缩的单个磁盘read和reread性能和两块磁盘的性能相当。
- 打开压缩和写时复制,关闭数据校验的情况下,write和rewrite性能显著下降–大约30%。然而,read和reread性能没有太多影响。这说明这个特定的测试表明,数据校验这个性能更多的受CPU的影响而不是磁盘性能。
以上测试结论或者在你的环境中有些不同,毕竟其影响因素太多,但是不管如何,对于一个还在开发过程中的文件系统而言,Btrfs已经有了非常可观的性能。而且,针对单个磁盘,当压缩选项打开后,iozone的测试性能是非常显著的。
小结
尽管Linux的开发和进展都非常好,但是还有一些人很早以前就要求Linux能够提供更好的文件系统,他们希望它具有企业级特性,而能和ZFS竞争。Btrfs应该回答和满足了这些人的需求。Btrfs在内核2.6.29时合并到了内核主干里,不过目前仍然是试验性质的。并不是上述所有的特性都已经实现了,但是目前的版本(v0.18)已经有了非常多的特性了。
尽管在CentOS 5.3系统(kernel 2.6.30-rc1)里,Btrfs还是试验性质,不过Btrfs的基本性能已经和ext4差不多了。
综合上面的测试案例,Btrfs的性能更多的受磁盘性能的影响,有时受CPU性能的影响(在使用压缩的测试例子里)。
你当然还可以更加深入的研究上述的测试结果,以获得更多的信息。
如果你看了这篇文章,对Btrfs甚至Linux产生了浓厚的兴趣,那我会非常高兴的。
注:以上内容大部分内容翻译自Linux Don’t Need No Stinkin’ ZFS: BTRFS Intro & Benchmarks,另外一部分内容加入了自己的看法和理解。