数百万个小文件的文件系统


44

在以下情况下,您将选择哪种Linux文件系统以获得最佳速度

  • 一亿个档案
  • 平均约2k文件大小
  • > 95%的读取权限
  • 相当随机的访问
  • 高并发(> 100个进程)

注意:文件存储在深层次树中,以避免目录过大。每个叶目录包含大约一千个文件。

您将如何进行基准测试?


3
还需要一些其他信息。例如,您是否将所有文件存储在平面目录中,还是存储在嵌套(排序)目录中?这会对文件访问时间产生巨大的性能影响。无论FS的类型如何,以“固定”方式筛选100,000,000个条目都将带来大量开销。最好的情况是,您正在查看某种树形搜索,仍然需要多次查找才能找到您的文件。如果将文件分类到子目录中,则访问时间将显着加快,因为每个级别上要搜索的条目较少。
艾利·佩恩

文件是串行访问还是并发访问?
史蒂夫·施耐普

Answers:


19

以下是一些比较所有主要linux FS和bonnie ++的结果,您可以将它们用作起点。

在随机搜寻方面,Reiser胜出,其次是EXT4,其次是JFS。我不确定这是否与目录查找完全相关,但是似乎可以作为一个指标。您必须为此专门进行自己的测试。在缺少文件创建时间的情况下,EXT2击败了一切,这可能是由于缺少日志,而EXT4却击败了除Reiser之外的所有内容,由于hans reiser的当前状态,您可能不想使用它。

您可能要研究支持NCQ的驱动器,并确保已安装安装程序以使用它。在繁重的寻找下,它应该可以提速。

最后,确保您的机器有大量的内存。由于文件不经常更新,因此如果有可用空间,Linux最终会将它们中的大多数缓存到ram中。如果您的使用模式正确,则将大大提高速度。


1
bonnie ++的问题在于它甚至不能粗略地测试我的使用情况
bene

2
您已经知道它不测试目录查找,但是说实话,如果这是您的瓶颈,那么最好将数据转储到真实数据库中。文件系统在大多数数据库设计要使用的小对象上的运行效果
不佳

7
@AndrewCholakian Link现在已死。
唐·斯科特

8

我同意安德鲁所说的大部分内容,只是我建议使用Reiser4或更旧的(但得到更好的支持)ReiserFS。正如这些测试(以及ReiserFS的文档)所表明的那样,它专门用于您所要询问的情况(大量的小文件或目录)。我过去曾在Gentoo和Ubuntu中使用ReiserFS,没有任何问题。

至于Hans Reiser的状态,我认为这与文件系统本身的代码或稳定性无关。Reiser4甚至由DARPA和Linspire共同赞助,因此尽管我同意还不确定Reiser文件系统的进一步开发,但我认为这并不是决定是否应使用它的决定性因素。


3
我已经使用ReiserFS很长时间了。实际上,我仍在尚未安装的旧Gentoo服务器上使用它。该装置今年五月有4年的历史。我可以告诉你的是,它已经大大降低了速度。在使用ReiserFS的所有文件系统上,这种现象已经随着时间的流逝发生了,在具有此类文件系统的所有计算机上,它们都处于活动读写状态,没有例外-因此,如果您想长时间使用它,则可以保留它。心里。我已经远离它了,现在将XFS​​用于大型文件系统。
MihaiLimbăşan,2009年

3

我知道这不是您问题的直接答案,但是在这些情况下,我认为数据库可能更适合托管此问题。小文件可以以二进制格式存储在数据库表中,并可以在wil处检索。使用这些文件的软件应该能够支持此操作...


1
什么是文件系统,甚至不仅仅是分层数据库?您的建议增加了抽象层,复杂性和软件层,这些层可能不被保证。此外,问题的所有者正在使用“ UNIX哲学”完成他的任务,我怀疑您不喜欢成为Windows专家吗?
斯图·汤普森

3
首先,我没有反对Unix或该领域的其他任何东西。文件系统和数据库之间存在很大差异,这就是两种技术都被开发的原因。数据库被设计为与大量的小型实体一起使用,在这些实体中,它们比大多数文件系统做得更好。我只是指出,您可能会走另外一条路。
Jeroen Landheer,2009年

1
而且,“清理/清理”数据库文件比对Linux上的文件系统进行碎片整理要容易得多。大多数/所有fs都不提供该功能,因为这是不必要的。不过,请注意上面的Mihai的评论,您可以看到它并非完全正确。
Gringo Suave


3

以我的经验,ext2会将ext4吹出小文件。如果您不关心写入完整性,那就太好了。例如,subversion创建了很多很多小文件,这些文件使ext4和其他文件系统(XFS)阻塞(运行cron作业,每半小时左右将数据从ext2同步到ext4,这实际上解决了这个问题。)

运行这些命令可使ext2更快(即使其中大多数选项会使文件系统在崩溃后变得不稳定,除非您在崩溃前运行sync)。这些命令对带有小文件的ext4几乎没有影响。

echo 15 > /proc/sys/vm/swappiness
echo 10 > /proc/sys/vm/vfs_cache_pressure
echo 99 > /proc/sys/vm/dirty_ratio
echo 50 > /proc/sys/vm/dirty_background_ratio
echo 360000 > /proc/sys/vm/dirty_expire_centisecs
echo 360000 > /proc/sys/vm/dirty_writeback_centisecs
echo "2000" > /proc/sys/vm/vfs_cache_pressure

1

我猜是ext3(或ext4),也许JFS是不错的解决方案。我会对ext4和btrfs保持警惕(文件系统很棘手-如果要使用最新的东西,请准备好备份)。

您还可以在mkfs期间调整各种参数,以根据需要调整文件系统。

我当然会建议不要使用 XFS。并不是因为它是一个糟糕的文件系统,而是在它上面进行创建/删除是一项昂贵的操作。


为避免目录搜索出现问题,请使用智能命名方案,例如:

<first letter of id>_<last letter of id>/<id>

或类似的更复杂的方案。这将加快目录搜索的速度,从而提高整体访问速度。(这是古老的Unix技巧,我认为是从V7开始的)


1
使用首个和最后一个字母而不只是前n个字母有什么好处?
bene

它只是可能的方案之一-是否会有所优势取决于用于索引的“键”。我看到的这种特定方案与在组织中将数据存储在组织中的应用程序有关,因此他们可以更好地建立索引。与往常一样,您需要将其适应您的数据,然后进行分析,直到找到确切的答案为止:)

1

大多数FS会在一个目录中阻塞超过65K个文件,我认为ext4仍然如此。Reiser文件系统没有该限制(mp3.com上的人们为此支付了费用)。不知道其他任何事情,但这就是ReiserFS的使用场景之一。


1
它是ReiserFS,而不是RieserFS
Daniel Rikowski 09年

这个周末,我在ext4上有一个目录,其中包含1000000个文件。只要您不这样做ls或使用制表符补全,它就会快速运行。可能是由于索引。
Ole Tange

ext4具有dir_index扩展名,可以加速一个目录中的许多文件。
alfonx '16
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.