什么是用于存储大量小文件(HDD,而不是SSD)的最高性能Linux文件系统?


43

我有一个包含许多小文件和少量大文件的目录树。文件的平均大小约为1 KB。树中有210158个文件和目录(此数字是通过运行获得的find | wc -l)。

每周有几次添加/删除/重写一小部分文件。这适用于小文件,以及(少量)大文件。

我尝试过的文件系统(ext4,btrfs)在磁盘上放置文件时遇到一些问题。在更长的时间范围内,磁盘(旋转媒体,而非固态磁盘)上文件的物理位置正变得更加随机分布。这种随机分布的负面结果是文件系统变慢(例如:比新文件系统慢4倍)。

是否有一个Linux文件系统(或文件系统维护方法)没有遭受这种性能下降的困扰,并且能够在旋转媒体上保持稳定的性能状况?该文件系统可以在Fuse上运行,但是必须可靠。


如果您知道哪些文件将变得很大/不会经常更改,哪些文件将变得很小/经常更改,那么您可能想要创建两个文件系统,并在文件系统上使用不同的选项,更适合每种情况。如果您需要它们可访问,因为它们是同一结构的一部分,则可以使用mount,symlinks做一些技巧。
Marcin 2012年

令我惊讶的是,一段时间以来btrfs(具有写时复制功能)一直呆滞。我很想与您分享结果,可能会互相帮助以进行性能调整的新方向。
Nikhil Mulley 2012年

在Linux上有一个新的在线zfs动物,以本机模式和融合实现提供,以防万一。
Nikhil Mulley 2012年

我曾经在linux上尝试过zfs,相当不稳定。设法经常完全锁定文件系统。Box可以工作,但是对FS的任何访问都将挂起。
Patrick

Answers:


47

性能

我写了一个小型基准测试(源代码),以找出哪种文件系统在处理数十万个小型文件时表现最佳:

  • 使用/ dev / urandom中的数据创建300000个文件(512B至1536B)
  • 重写30000个随机文件并更改大小
  • 读取30000个连续文件
  • 读取30000个随机文件
  • 删除所有文件

  • 每一步后同步和删除缓存

结果(以秒为单位的平均时间,越低越好):

Using Linux Kernel version 3.1.7
Btrfs:
    create:    53 s
    rewrite:    6 s
    read sq:    4 s
    read rn:  312 s
    delete:   373 s

ext4:
    create:    46 s
    rewrite:   18 s
    read sq:   29 s
    read rn:  272 s
    delete:    12 s

ReiserFS:
    create:    62 s
    rewrite:  321 s
    read sq:    6 s
    read rn:  246 s
    delete:    41 s

XFS:
    create:    68 s
    rewrite:  430 s
    read sq:   37 s
    read rn:  367 s
    delete:    36 s

结果:
尽管Ext4的整体性能不错,但是ReiserFS在读取顺序文件方面非常快。事实证明,XFS包含许多小文件的速度很慢-在此用例中不应使用它。

碎片问题

防止文件系统在驱动器上分发文件的唯一方法是,使分区仅保持您真正需要的大小,但要注意不要将分区设置得太小,以防止文件内碎片。使用LVM可能会很有帮助。

进一步阅读

Arch Wiki上有很多有关文件系统性能的文章:

https://wiki.archlinux.org/index.php/Beginner%27s_Guide#Filesystem_types

https://wiki.archlinux.org/index.php/Maximizing_Performance#Storage_devices


4
您应该基于比较指定您的内核版本。XFS在最近的一个内核中有了非常明显的速度改进(认为它是2.6.31,但请不要在此引用我)。
Patrick

1
btrfs在内部执行lvm技巧。它分配磁盘的较小块并将文件放在这些块中,然后仅在现有块填满时才分配磁盘的另一个块。
psusi'1

1
任何文件系统都是如此。这就是为什么应用程序使用fsync()之类的原因。
psusi 2012年

2
@taffer,是的。事务与日记在其他文件系统中的作用相同:它们保护fs元数据。从理论上讲,应用程序可以按照您描述的方式来使用它们,但是目前没有允许应用程序打开和关闭事务的api。
psusi 2012年

1
@taffer您的“最新基准”是从2015年4月开始的,已有3年的历史,并且仅使用带有默认选项的XFS。这早于xfsprogs 3.2.3,它使XFS v5成为默认值及其带来的所有好处。它也没有使用-m finobt = 1格式化,这是具有较小文件和大量元数据更新的XFS性能的游戏改变者。不,没有灵丹妙药,但是将您的观点基于旧基准是不明智的,尤其是当主要的性能更改功能被忽略,不可用或禁用时。
Jody Lee Bruchon '18

7

我正在使用ReiserFS来完成此任务,它特别适合处理许多小文件。在funtoo Wiki上有一个易于阅读的文本

ReiserFS还具有许多专门用于提高小文件性能的功能。与ext2不同,ReiserFS不会在固定的1 k或4 k块中分配存储空间。相反,它可以分配所需的确切大小。


1
ReiserFS也存在稳定性问题-因此RH和SuSE删除了该FS。从原理上(基于BTree的FS),BTRFS应该是可比的。
尼尔斯2012年


0

XFS在这种情况下表现出色。这就是为什么我们在邮件存储中使用它的原因(它可以在一个目录中包含成千上万个文件)。与ReiserFS相比,它具有更好的容错能力,使用范围更广,并且通常是非常成熟的文件系统。

此外,XFS支持联机碎片整理。尽管它确实使用了延迟分配技术,但这种技术从一开始就减少了碎片(相对于其他文件系统)。


20
XFS在这种情况下表现出色。[需要引用]
taffer 2012年

8
嗯,xfs以相反的方式特别出名:大文件确实可以很好地工作,而小文件却不能很好地工作!看看这个详尽的基准例如(或直接跳到结论10页^^上):ilsistemista.net/index.php/linux-a-unix/...
利未人

1
@Levit我认为您误读了该报告。该报告非常清楚地表明XFS对于随机IO的性能非常好。除此之外,该报告并未解决此问题中的方案类型,即文件很多。随机IO是一回事,大量文件是ext *面面俱到的地方。
帕特里克

2
XFS真正更好的唯一地方是随机读取/写入操作(仍然很奇怪,机械磁盘上​​的真正随机读取模式能够获得10MB / s的速度-在我看来,这是一些在现实世界中无法实现的优化(imho)),而在第7页上却恰好显示了我之前所说的内容,XFS在处理大文件方面确实很棒!查看第3&5页,尤其是第3页,您会发现它处理小文件显然不如ext好!我确实没有针对XFS的任何东西,但是我要说的是,从随处可见的内容来看,对于许多小文件来说,这并不是最佳选择!
2014年

5
如果大型文件随机/缓慢扩展,并且长时间扩展,则XFS 在处理大文件时也会非常慢。(典型syslogd模式。)例如,在我刚才观察到的通过MD XFS设置的情况下,删除1.5 GB的文件花了4.75分钟(!),而磁盘驱动器以写入速率限制为100个事务/秒的限制。超过2 MB / s。这也严重影响了同一驱动器上其他并行执行的IO操作的性能,因为该驱动器已经达到极限。从来没有在其他FS中看到过类似的东西(或正在基准测试中)。
蒂诺2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.