贝壳原来一直认为文件系统可以随便选,结果最近吃了两次苦头。一个是btrfs对虚拟机支持不良,另一个是特定情况下xfs性能比ext3高20倍。痛定思痛,打算列一下文件系统选型的方法和依据,欢迎拍砖。
下面我列一下纳入参考的文件系统,当然,ntfs就不要出来搞基了,玩嵌入式/光盘live之类的朋友也不要来凑热闹了阿。
btrfs(
简介),
ext3,
ext4(
简介),
jfs(
简介),
reiserfs,
xfs,基本涵盖常用文件系统。最下面加入ntfs和zfs对比,实际上不参与选型。以下进制换算为1024,大小依次为KB,MB,GB,TB,PB,EB,ZB。
文件系统 | btrfs | ext3 | ext4 | jfs | reiserfs | reiser4 | xfs | ntfs | zfs |
最大卷容量 | 16 EB | 32 TB | 1 EB (16TB) | 32 PB | 16 TB | ?? | 16 EB | 256 TB | 16 EB |
最大文件容量 | 16 EB | 2 TB | 16 TB | 4 PB | 8TB | 8TB | 8 EB | 16 TB | 16 EB |
目录结构 | B tree | list/tree | list/Htree | B tree | B+ tree | dancing B* tree | B+ tree | B+ tree | hash table |
文件分配 | extents | bitmap/table | bitmap/extents | bitmap/extents | bitmap | ?? | extents | bitmap | ?? |
ACLS | Yes | Yes | Yes | Yes | No | No | Yes | ACLS only | Yes |
checksum | Yes | No | journal | No | No | No | No | No | Yes |
透明压缩 | Yes | No | No | No | No | Plugin | No | Yes | Yes |
透明加密 | No | No | No | No | No | Plugin | No | Yes | Yes |
online defrag | Yes | No | Yes | Yes | No | Yes | Yes | Yes | Yes |
shrink | Yes | Yes | Yes | No | Offline resize | Offline | No | Yes | No |
特性 | SSD | Stream |
首先,文件系统选择上要考虑现实性和支持情况。如果你希望得到广泛的支持,在移动硬盘上被多个系统挂载,应用于老内核,或者不使用/boot分区,那么可选项目基本只有ext3。作为老牌文件系统,ext3的支持是最广泛的,工具组也相对全面。无论其他文件系统拥有多大的优势,在现实情况考虑下往往会败给ext3,基本就是因为广泛的使用和支持。另外,btrfs我所知还没有fsck工具,出了问题全看RP,而且在上面使用虚拟机速度特别慢。reiser4作者目前在*中,出了问题能否获得支持全靠RP。jfs用的人相对xfs少一些,也比较不活跃。这些虽然并不出现在数据上,但是最好特别注意。
其次,文件系统的选择要考虑必要特性。例如如果你希望使用SSD支持,你可选的项目就只有btrfs。如果需要透明加密,那只有reiser4。当然,在决定必要特性前,请仔细考虑,自己是否真的必须使用这些特性。为了一个不必须的特性选用一个不合适的文件系统会付出极大代价。linux下文件系统还是比较单调和弱小了点,基本不支持透明压缩,全部不支持透明加密,ext两兄弟更是没有完全实现Btree目录结构(ext4其实有用Htree,一种改过的Btree,不过为了兼容ext3,好像升级来的目录不使用)。不过好佳在,大部分都支持online defrag/growing,否则不如一头撞死算了。ext3/4, btrfs是支持shrink的,但是jfs, xfs只支持growing,reiser4必须offline shrink。xfs的growing在1T(一说2T)以上有点问题,非64位内核在1T以上可能无法创建inode。本来是会在1T内创建inode,使用高位空间。但是growing的时候可能地位空间已经满了,会报没有空间的错误。解决方案是将老文件移出再移回,或者看看用inode64参数是否解决。如果你确定需要shrink,最佳选项是使用ext4。另外补充一点,ntfs的online shrink也不是完美无缺,他只能shrink到未被使用的地方。也就是说,如果有不可移动文件,有可能就无法shrink到以下内容。
第三个要确定的问题,是你的系统服务的数据大小。即使是表里面最小的ext3,一次也可以使用2T的卷。贝壳全部数据加起来大概2T多一点,家用绝对不成问题。然而作为商业用途,动辄数百T的数据正常到不能再正常,ext3就可以直接出局了,同理reiser4也直接出局。jfs是唯一没有达到EB级别的文件系统,不过32PB也可堪一用,大部分商业系统都到不了这个量级。在管理大型卷的时候,bitmap比extents会消耗更大的空间进行管理。因此不支持bitmap的文件系统可以少考虑,ext3/4虽说支持extents,但是ext3中默认不开启,必须手工指定挂载参数。ext4中一旦启用extents,就无法兼容于ext3。
最后是性能考量。在贝壳在公司的测试中,xfs会性能高于ext3达20倍。因为根据
这篇文章,xfs的随机写性能比ext兄弟差很多,但是顺序写的性能比ext要强上无数倍。我们的业务大部分情况下是顺序写,因此差异非常明显。所以,当你的特性要求差不多的时候,性能和稳定性是另一个考量因素。
文件系统 | btrfs | ext3 | ext4 | jfs | reiserfs | xfs |
全填充速率 | 1m22.083s | 1m34.821s | 1m15.495s | 1m5.819s | 1m34.310s | 1m38.953s |
全填充利用率 | 0.8945 | 0.9065 | 0.9047 | 0.9959 | 0.9927 | 0.9918 |
大文件效率 | 14.676 | 17.435 | 10.7255 | 13.7493 | 14.319 | 12.7093 |
大文件删除 | 2.693 | 5.262 | 2.422 | 0.037 | 1.802 | 0.296 |
小文件效率 | 9.949 | 5.131 | 2.7866 | 40.949 | 13.605 | 8.978 |
小文件删除 | 6.737 | 10.7227 | 1.39 | 16.116 | 2.756 | 5.653 |
循环列文件 | 0.124 | 0.089 | 0.002 | 0.094 | 0.19 | 0.099 |
大文件read | 2046206 | 1931451 | 1946598 | 2003912 | 1537752 | 1970242 |
大文件write | 1279625 | 565960 | 926461 | 962617 | 446841 | 812466 |
大文件rndread | 2012771 | 1926287 | 1934420 | 1985273 | 1490199 | 1976056 |
大文件rndwrite | 1380404 | 1187010 | 1294689 | 1446011 | 1308210 | 1384804 |
小文件read | 2375893 | 2934815 | 3019732 | 2708437 | 2559371 | 2236197 |
小文件write | 926602 | 526469 | 681710 | 844237 | 395810 | 939536 |
小文件rndread | 3324647 | 3544566 | 2702282 | 3737551 | 4045575 | 2666753 |
小文件rndwrite | 910277 | 1525970 | 1244240 | 1910756 | 1790393 | 1311261 |
以上数据,在公司的debian testing上测定。机器型号Dell Inspiron 560s,CPU Dual-Core E5700,4G内存,硬盘WDC WD3200AAKS-75L9A0。系统是debian testing,内核2.6.39-2-amd64。全填充是用time dd if=/dev/zero of=abc来测试填满一个分区的速度和容量。大文件是四个ISO文件,共1.3G,从tmpfs上复制到目标设备上的时间平均值,三次平均。小文件是pypy/python2.7/linux kernel2.6.39所有源码,总计49242个文件,629M。从tmpfs上复制到目标设备的时间平均值,三次平均。循环列文件是通过time find .测试效率。下面测试单位为bytes/sec,是iozone测试结果。
首先是文件利用率,btrfs/ext3/ext4会消耗10%左右的空间作为系统消耗。如果你需要比较高的磁盘利用率,请不要考虑这三种系统。也许你会认为,放文件又不会放满,必须空出部分来才能减少文件碎片。实际上,被消耗掉的空间也并不是白白消耗,你的所有数据,都会增加10%的系统消耗空间。因此ntfs的防碎片阀值(为了防止碎片化,磁盘使用率不应当高于)大约是85%,而ext3就只有75%-80%。
其次是大文件效率,除了ext3不予考虑外,其余系统都过的去。btrfs/ext4在删除大文件的时候耗时略多,大概是和管理特性有关。
第三是小文件效率。如果你需要用小文件,千万不要考虑jfs,慢到我无法相信。ext4比btrfs和xfs快了四倍左右,非常适合操作大量小文件。例如源码编译,有blog说ext4比xfs快数倍。
最后是循环列文件效率,同样,ext4一枝独秀,其余水准相去不远。
综合以上几个考量,linux中比较推荐的文件系统是ext4, xfs两种。大量文件存储用xfs,小规模文件密集使用用ext4。在特定情况下,可以使用btrfs(它的特性非常全)或者jfs(小文件操作慢,但是随机读写快)。兼容考量下,可以用ext3。不推荐使用reiser4。
参考:
- Linux filesystems benchmarked: EXT3 vs EXT4 vs XFS vs BTRFS – Bonnie++ random seeks and file handling
- Ext4 ReiserFS Btrfs 等7种文件系统性能比拼
- Filesystems (ext3, reiser, xfs, jfs) comparison on Debian Etch
- XFS, Reiser, JFS & ext3 performance on Suse 9 Enterprise
- Filesystems (jfs, xfs, ext3) comparison on Debian