Total Pageviews

Sunday, 15 October 2017

linux下的文件系统选型

原来一直认为文件系统可以随便选,结果最近吃了两次苦头。一个是btrfs对虚拟机支持不良,另一个是特定情况下xfs性能比ext3高20倍。痛定思痛,打算列一下文件系统选型的方法和依据,欢迎拍砖。
    下面我列一下纳入参考的文件系统,当然,ntfs就不要出来搞基了,玩嵌入式/光盘live之类的朋友也不要来凑热闹了阿。btrfs(简介), ext3ext4(简介), jfs(简介), reiserfsxfs,基本涵盖常用文件系统。最下面加入ntfs和zfs对比,实际上不参与选型。以下进制换算为1024,大小依次为KB,MB,GB,TB,PB,EB,ZB。
文件系统btrfsext3ext4jfsreiserfsreiser4xfsntfszfs
最大卷容量16 EB32 TB1 EB (16TB)32 PB16 TB??16 EB256 TB16 EB
最大文件容量16 EB2 TB16 TB4 PB8TB8TB8 EB16 TB16 EB
目录结构B treelist/treelist/HtreeB treeB+ treedancing B* treeB+ treeB+ treehash table
文件分配extentsbitmap/tablebitmap/extentsbitmap/extentsbitmap??extentsbitmap??
ACLSYesYesYesYesNoNoYesACLS onlyYes
checksumYesNojournalNoNoNoNoNoYes
透明压缩YesNoNoNoNoPluginNoYesYes
透明加密NoNoNoNoNoPluginNoYesYes
online defragYesNoYesYesNoYesYesYesYes
shrinkYesYesYesNoOffline resizeOfflineNoYesNo
特性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要强上无数倍。我们的业务大部分情况下是顺序写,因此差异非常明显。所以,当你的特性要求差不多的时候,性能和稳定性是另一个考量因素。
文件系统btrfsext3ext4jfsreiserfsxfs
全填充速率1m22.083s1m34.821s1m15.495s1m5.819s1m34.310s1m38.953s
全填充利用率0.89450.90650.90470.99590.99270.9918
大文件效率14.67617.43510.725513.749314.31912.7093
大文件删除2.6935.2622.4220.0371.8020.296
小文件效率9.9495.1312.786640.94913.6058.978
小文件删除6.73710.72271.3916.1162.7565.653
循环列文件0.1240.0890.0020.0940.190.099
大文件read204620619314511946598200391215377521970242
大文件write1279625565960926461962617446841812466
大文件rndread201277119262871934420198527314901991976056
大文件rndwrite138040411870101294689144601113082101384804
小文件read237589329348153019732270843725593712236197
小文件write926602526469681710844237395810939536
小文件rndread332464735445662702282373755140455752666753
小文件rndwrite91027715259701244240191075617903931311261
以上数据,在公司的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。
参考:
  1. Linux filesystems benchmarked: EXT3 vs EXT4 vs XFS vs BTRFS – Bonnie++ random seeks and file handling
  2. Ext4 ReiserFS Btrfs 等7种文件系统性能比拼
  3. Filesystems (ext3, reiser, xfs, jfs) comparison on Debian Etch
  4. XFS, Reiser, JFS & ext3 performance on Suse 9 Enterprise
  5. Filesystems (jfs, xfs, ext3) comparison on Debian

----------------------

Btrfs文件系统

简介

BtrFS(B-tree 文件系统,又称为 Butter FS 或 Better FS),2007 由 oracle 开源后,得到了 IBM、intel 等厂商的大力支持,其目标计划是替代 linux 目前的 ext3/4,成为下一代 linux 标准的文件系统。 支持写时复制(CoW)、快照、在线扩容缩容、数据 checksum、subvolume、磁盘阵列(raid)等,运行在 linux 上,并遵循 GPL 协议的强大文件系统。

  1. CoW(Copy on Write)可以保证数据一致性,每次改动块都会创建新的文件
  2. 基于 Cow 技术可以在 volume 和文件级别创建快照
  3. 数据块和 inode 都可以动态分配
  4. 可以给 metadata 和 data 块来创建多个副本

文件系统管理

创建

# 单个设备
mkfs.btrfs -L data /dev/sdb1
# 多个设备,metadata保留多个副本
mkfs.btrfs -d raid0 -m raid1 /dev/sdb1 /dev/sdc1

添加/删除设备

btrfs device add /dev/part3
btrfs device remove /dev/part3

修改数据快或者 meta 块的副本

btrfs balance start -dconvert=dup /srv/shared/
btrfs balance start -mconvert=dup /srv/shared/

创建挂载删除 subvolume

btrfs subvolume create /srv/shared/video
mount -o subvol=video /dev/sdb1 /mnt
umount /mnt
btrfs subvolume delete /srv/shared/video

Quota 磁盘配额

适用于多用户场景,给每个用户分配固定的空间,还可以动态调整

# enable quota for subvolume
btrfs quota enable /srv/shared/video
# get limit
btrfs qgroup show -reF /srv/shared/video
# set limit
btrfs qgroup limit -e 10G 0/260 /srv/shared/video/

然后测试下配额是否生效

# dd if=/dev/zero of=/mnt/11G.bin bs=1M count=20480
dd: error writing '/mnt/11G.bin': Disk quota exceeded
10240+0 records in
10239+0 records out
10737377280 bytes (11 GB, 10 GiB) copied, 163.942 s, 65.5 MB/s

快照

建快照就是从当前状态下的 subvolume 新建一个 subvolume,你也可以直接挂载 snapshot

btrfs subvolume snapshot /srv/shared/video /srv/shared/video-backup
mount -o subvol=video-backup /dev/sdb1 /mnt
ls /mnt
umount /mnt
btrfs subvolume delete /srv/shared/video-backup

高能警告

目前社区有一些关于 btrfs 非常负面的评价,褒贬不一,使用前请想好退路,数据无价。看看官方的 status 页面,了解下各个功能当前是否稳定了。

 

 

No comments:

Post a Comment