大多数人的文件系统的概念是“说事儿,保持在目录中组织了我的文件,并让我对他们设置权限”。换句话说,它只是一个工具。但是,也正是在这一个隐含的讨价还价。为了换取信任我们的文件的软件,我们期望一个文件系统是快速交付和存储我们需要的数据,也不会破坏它的任何任何奇怪或不寻常的方式。
大多数人的文件系统的概念是“,保持在目录中组织了我的文件,并让那个东西我对其设置权限”。换句话说,它只是一个工具。但是,也正是在这一个隐含的讨价还价。为了换取信任我们的文件的软件,我们期望一个文件系统是快速交付和存储我们需要的数据,也不会破坏它的任何任何奇怪或不寻常的方式。
文件系统开发人员所面临的问题,坦率地说,变得越来越困难。它们正面临不断增长的磁盘大小,同时寻道时间跟不上它们需要查找的磁盘大小。一些文件系统开发人员甚至希望能够发现损坏数据的硬件错误并从这些错误中恢复,例如,当硬盘开始出现故障时可能发生的那种错误。
在fsck的问题
在2007年的Linux存储和文件系统研讨会,瓦莱丽·亨森汇报了“fsck的问题”造成寻道时间跟不上磁盘大小的步伐,从而导致过度的咖啡因摄入量在等待“的fsck”文件系统检查程序崩溃或电源故障后运行。此前,在2006年一Usenix大会的论文中,她写道:“最近对kernel.org的主服务器,主机好几年的Linux内核档案,在RAID级别遭受文件系统损坏;在(日志)ext3文件系统上运行fsck的一周接手,超过所需的时间从备份恢复整个文件系统“。
布兰登·菲利普斯报告在LWN那瓦尔说明这与她的几乎60%满home分区,一个非常温和的37GB。使用希捷估计磁盘技术的进步,她预测目前的8分钟的fsck时间将扩大至80分钟为一个分区16倍,只是因为寻道时间没有跟上带宽和磁盘。
由于fsck问题和其他问题,新的Linux文件系统正在出现。但还没有出现任何一个新一代的竞争者。本文的目的是研究Linux中新出现的文件系统的性能,因此我决定混合使用实际工作任务和综合基准测试来测试我选择使用的各种文件系统。
如果你喜欢的文件系统实验这里没有测试过,请接受我的道歉。被选择的那些是那些我已经与(ZFS / FUSE,NILFS,BTRFS),或者是那些已经得到的关注(Reiser4的,EXT4,ChunkFS)相当数量的实验。我也选择了抛出这个OpenSolaris的下混合ZFS的测试,并会也包括FreeBSD 7下ZFS如果安装程序已经能够认识到Adaptec的RAID卡的PCI ID。
文件系统的类型
在写入和排列磁盘上的数据时,本文研究的所有文件系统都使用一个(或多个)分配策略。
基于块的文件系统
在基于块的文件系统的文件和目录是由一个或磁盘的多个固定大小的块(“嵌段”)构成。这意味着,如果现有的文件被另一个文件后,扩展已被写入(或文件系统一直在使用一段时间后)的块可以散布在盘片(“碎片”),从而导致性能下降时,阅读或写入。
原来的Unix文件系统是基于块的,因为是传统的Linux文件系统:EXT,ext2和ext3。
基于扩展区的文件系统
基于扩展区的文件系统,采取不同的方法来保存文件数据。而不是使用单独的块,它们分配磁盘的条带(“范围”),并继续写入文件,直到程度被填满。一旦填满下一程度分配,因此它继续。碎片仍然会发生,然而,当文件系统被填满。
自带当提到范围脑海的通常的文件系统是SGI的XFS,但现在在Linux中,我们有实验EXT4文件系统的支持程度为好。
注:XFS碎片整理
XFS提供了一个名为xfs_fsr的在线碎片整理工具,它将扫描XFS文件系统,寻找碎片化的文件,如果有合适的可用空闲空间,就对它们进行碎片整理。例如:
伊诺= 144428307
之前:25292之后:1 DONE ino=144428307
基于日志的文件系统
基于日志的文件系统是建立的前提是为RAM系统中的量增加,读取和写入操作往往会被写入主导之间的平衡,因为读可以由缓冲区高速缓存服务。基于日志的文件系统通过处理文件系统作为一个或多个连续的缓冲液和总是写入缓冲器的头部优化写入。
这意味着,当文件被删除或截断,自由空间的日志中积聚,因此必须提供,通常在一个垃圾收集后台程序的形式回收与空间的一些方法。
这里将要考虑的基于日志的文件系统是NILFS和ZFS。
试验机
用于该测试的系统是好心由贷款氙气系统澳大利亚的墨尔本。这台机器是一个Krypton Duo HW2,拥有两个双核AMD Rev.F Opteron处理器,8GB RAM(可扩展到64GB)和873gb Seagate Cheetah 15K。通过Adaptec 31605 16端口SAS RAID控制器(AAC RAID家族)驱动5个串行附加SCSI (SAS)驱动器。
该驱动器并没有做成一个硬件RAID集,而是单独提供给主机操作系统。这是说起来容易,与31605 RAID卡做,因为你必须去为每个驱动器JBOD阵列,而不是在所有的只是没有配置任何阵列。所有驱动器的写入缓存被禁用,以减少任何混淆效果。
其原因不使用单个RAID阵列是允许ZFS / FUSE的比较处理与在软件RAID条带运行ZFS / FUSE条带化的。
图1所示。测试服务器,氙氪Duo HW2
Linux安装
该系统安装与Ubuntu 7.04服务器,我选择使用32位版本,而不是64位版本,因为它更有可能的是,这是主要的开发平台,然后将代码移植到64位架构。当然,这似乎是NILFS如此。
使用的是2.6.22.1内核(测试时的最新稳定版本),基本配置从Ubuntu 7.04 2.6.20-16服务器导入。除了包含EXT4开发文件系统(请参阅下面的内容)之外,没有做任何重大更改,因为Ubuntu内核配置已经设置了CONFIG_EXPERIMENTAL选项。
有跨使用的mdadm因此SAS硬盘七创建一个单一的RAID卷:
# mdadm——create /dev/md0——level=0——raid-devices=7 /dev/sdb1 /dev/sdc1 /dev/sdd1 /dev/sde1 /dev/sdf1 /dev/sdg1 /dev/sdh1
这产生了以下阵列,在/ proc / mdstat如下所示:
个性:[raid0]
MD0:活性RAID0 SDH1 [6] sdg1 [5] SDF1 [4] SDE1 [3] SDD1 [2] SDC1 [1] SDB1 [0]
500929856块64K块
这个500GB的软件RAID阵列被用作在Linux下测试下面列出的所有文件系统的基础。
测试
Linux内核是飞驰有用的文件系统。如果你是做了很多的文件I / O,并具有RAM来备用,内核将分配的那部分缓冲和文件缓存通过磁盘加速I / O。在试验机采用的是不做得比其他标杆其他很多8GB内存,有足够的RAM自由的此类任务。现在,这是伟大的,如果你正在做的实际工作,但基准它是一个绝对的噩梦,因为你最终测试内核可以如何有效缓存而不是在文件系统中执行得怎么样。
合成基准像邦尼++竭尽全力解决此;例如邦尼++默认使用的尺寸的文件在总系统的RAM的两倍。
当然,现实世界中的测试不能做到这一点,所以我试图拆了标准的“提取压缩包,配置,使”序列和交织在一起,扔综合测试中也保持其脚趾内核和(希望)保持缓存充满信息是无关的下一个测试阶段。
这将是几乎不可能重现相同的步骤,每次都没有任何测序错误或错别字,尤其是当一些测试可能需要一个小时或更长时间,并试图这样做是疯狂配方和大量的深夜中。因此,不是,测试的全序列脚本,这样一个新的文件系统可以长大,一个完整的试运行开始,不断的精彩画面项目下保持运行。
请注意:对于那些谁没有使用屏幕,或听说过它,这大概是我所遇到的最有用的终端程序之一。屏幕出生于1987年,可以认为,作为终端的窗口管理器,让用户在创建它,甚至断开额外的终端窗口,让他们(及其相关程序)运行,然后从不同的位置重新连接。实际的测试运行,在他们执行的顺序,列举如下。
解开内核
本使用Linux 2.6.22.1的未压缩的压缩包,并用tar -xf $ tar文件做一个简单的定时提取物,其中$ tar包是一个内核tar归档保存在根文件系统,它自己的主轴。
这将测试大量小文件和目录的创建,生成的树稍后使用。
提取GCC
它使用GCC 4.2.0的一个未压缩的压缩包,并使用tar -xf $ tarball执行一个简单的定时解压,其中$ tarball存储在根文件系统中,在它自己的主轴上。
这也是测试大量小文件和目录的创建,并再次被后面的测试要求。
在内核源代码的递归随机文件
在2.6.22.1源代码树中的所有文件的清单是用随机RL工具(封装在Ubuntu作为随机化线),然后保存。在测试时该文件被馈送到定时xargs的文件和输出重定向到/ dev / null的。
这里被要求阅读所有23742页的文件随机散布在整个大的目录树,当我们正在测试的文件系统的性能。
配置GCC
这只是对之前提取的GCC 4.2.0源代码的定时配置,以便为以后的测试编译做好准备。
GNU configure脚本不做很多I/O工作,但是创建并尝试编译几个小型测试程序,以检查系统编译器是否正常工作。
Kernbench
Con Kolivas的kernbench倍内核具有不同-j值,首先的-j3一半负荷试验中,最佳-j16负载和全口径-j将运行尽可能多的构建。
在这里,我们只是看的总时间“快速”(-f)运行避免了在RAM中缓存的内核文件 - 否则我们也不会看的区别是,文件系统带来的!
请注意:看来kernbench不检查任何错误的版本,但它每次通过报告个人编译时间,这里异常短的时间指示失败。 |
GCC编译
GCC编译系统对我们来说有一个非常有用的特性,make bootstrap选项执行三个阶段的GCC构建。stage1构建使用系统编译器,stage2使用stage1编译器,而stage3使用stage2。
然后比较阶段2和阶段3的构建,如果一切正常,它们应该是相同的。如果不然后出现了一些错误,如果在标准内核文件系统上没有失败,我们可以非常确信它与被测试的文件系统有关。
我们也这个时间化妆-j16引导进行比较。
请注意:由于ELF对象文件包括一个16字节的首部,可以从生成改变的构建,该GCC构建系统跳过前16个字节产生的目标文件。这可以看出,在从配置输出如下:
检查如何比较引导的对象…cmp—igno- initial=16 $f1 $f2
GCC编译
这是一个简单的定时室射频的linux-2.6.22.1。
这为文件系统在删除大量文件和目录时如何执行提供了一个很好的、真实的示例。
邦尼++文件操作
为了让内核的全面锻炼,清除其残留任何海合会构建的缓存(如果删除Linux源代码树并没有解决它),我们现在运行罗素焦化装置邦尼++,禁用除文件创建、统计和删除测试之外的所有测试。我们使用-n 100选项让它使用102400个文件运行这些测试。
这是定时进行比较,结果列出每个文件系统。
请注意:当在小于500毫秒一个邦尼++测试阶段完成时,它产生的形式的输出++++,因为它作为一个足够的时间以产生一个准确的结果的。
删除GCC树
现在,我们可以一次去除GCC构建树。
同样,这提供了如何与大量的呼叫取消链接(2)文件系统COPES的一个良好的,真实的例子。
tiobench螺纹I / O
为了提供另一个多进程做I/O的测试,我们使用tiobench包装器进行tiotest,尽管这个包装器没有为系统中的RAM量自动调整自己,因此应该从内核缓冲区缓存得到很好的帮助。
因为这会产生很多相当复杂的输出,我们只在过程的总体运行时的样子。缩短运行时间指示文件系统,能够更好地应付多个读者和作家。
邦妮++智能I / O
为了完成测试,我们返回到Bonnie++并只使用-f选项运行它,从而跳过每个字符的测试,而是检查基于块的I/O的写、重写和读取。
结果与以前的邦妮++文件操作的结果一起列,整个运行是定时进行比较。
总时间
这是整个测试集的总体运行时。
对于存在文件访问模式分布的一般工作负载,这可能是最好的数据。
<下一个故事:新兴的Linux文件系统第2部分>
了解更多关于这个话题
这个故事,“新兴Linux文件系统”最初发表LinuxWorld-(美国) 。