bene Asked: 2009-05-10 14:38:38 +0800 CST2009-05-10 14:38:38 +0800 CST 2009-05-10 14:38:38 +0800 CST 数百万个小文件的文件系统 772 在以下情况下,您会选择哪种 Linux 文件系统以获得最佳速度: 一亿个文件 平均约 2k 文件大小 >95% 读取访问 相当随机的访问 高并发(>100 个进程) 注意:文件存储在深层层次树中,以避免大目录。每个叶目录包含大约一千个文件。 您将如何对其进行基准测试? linux filesystems benchmark 7 个回答 Voted Andrew Cholakian 2009-05-10T15:37:42+08:002009-05-10T15:37:42+08:00 在随机搜索方面,Reiser 胜出,EXT4 次之,JFS 次之。我不确定这是否与目录查找完全相关,但它似乎是一个指标。您必须专门为此进行自己的测试。EXT2 在文件创建时间上胜过一切,可能是因为它缺少日志,但 EXT4 仍然胜过除 Reiser 之外的所有东西,由于 hans reiser 的当前状态,您可能不想使用它。 您可能想查看支持 NCQ 的驱动器,并确保您的安装设置为使用它。在繁重的搜索下,它应该提供速度提升。 最后,确保你的机器有大量的内存。由于文件不经常更新,如果有空闲空间,linux 最终会将它们中的大部分缓存到内存中。如果您的使用模式正确,这将为您带来巨大的速度提升。 Mike 2009-05-10T16:34:13+08:002009-05-10T16:34:13+08:00 我同意 Andrew 所说的大部分内容,但我会推荐Reiser4或更旧的(但得到更好的支持)ReiserFS。正如这些测试(以及 ReiserFS 的文档)所表明的那样,它专为您所询问的情况(大量小文件或目录)而设计。我过去在 Gentoo 和 Ubuntu 上使用过 ReiserFS,没有任何问题。 至于 Hans Reiser 的状态,我不认为这是文件系统本身的代码或稳定性问题。Reiser4 甚至得到了 DARPA 和 Linspire 的赞助,所以虽然我同意 Reiser 文件系统的进一步开发尚未确定,但我不认为这应该成为决定是否有人应该使用它的因素。 Jeroen Landheer 2009-05-10T23:09:23+08:002009-05-10T23:09:23+08:00 我知道这不是您问题的直接答案,但在这些情况下,我认为数据库可能更适合托管它。小文件可以二进制格式存储在数据库表中,并可以随意检索。使用这些文件的软件应该能够支持这一点...... thenickdude 2013-04-04T22:22:06+08:002013-04-04T22:22:06+08:00 Unix StackExchange 上的某个人创建了一个基准测试(带有源代码)来测试这种情况: 问:存储大量小文件(HDD,而不是 SSD)的最高性能 Linux 文件系统是什么? 最好的读取性能似乎来自 ReiserFS。 Jason Hall 2015-10-31T08:51:00+08:002015-10-31T08:51:00+08:00 以我的经验,ext2 将 ext4 用于小文件。如果您不关心写入完整性,那就太好了。例如,subversion 创建了很多很多很多的小文件,ext4 和其他文件系统(XFS)会阻塞(运行一个 cron 作业,每半小时左右将数据从 ext2 rsync 到 ext4,实际上可以解决问题。) 运行这些命令可以使 ext2 更快(尽管这些选项中的大多数会使文件系统在崩溃后变得不稳定,除非您在崩溃之前运行同步)。这些命令对带有小文件的 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 p_l 2009-06-01T09:07:47+08:002009-06-01T09:07:47+08:00 我猜想 ext3(或 ext4),也许 JFS 会是不错的解决方案。我会对 ext4 和 btrfs 保持警惕(文件系统很棘手——如果你想使用最新的东西,请准备好备份)。 您还可以在 mkfs 期间调整各种参数,以根据自己的喜好调整文件系统。 我当然会推荐反对XFS。不是因为它是一个糟糕的文件系统,而是因为创建/删除是一项昂贵的操作。 为避免目录搜索出现问题,请使用智能命名方案,例如: <first letter of id>_<last letter of id>/<id> 或类似的,更复杂的方案。这将加快您的目录搜索速度,从而提高整体访问速度。(这是一个古老的 unix 技巧,我认为是从 V7 回来的) Ronald Pottol 2009-06-08T20:38:19+08:002009-06-08T20:38:19+08:00 大多数 FS 会在一个目录中被超过 65K 的文件阻塞,我认为 ext4 仍然如此。Reiser 文件系统没有这个限制(mp3.com 上的人付钱来确保这一点)。不确定其他任何事情,但这是 ReiserFS 的使用场景之一。
在随机搜索方面,Reiser 胜出,EXT4 次之,JFS 次之。我不确定这是否与目录查找完全相关,但它似乎是一个指标。您必须专门为此进行自己的测试。EXT2 在文件创建时间上胜过一切,可能是因为它缺少日志,但 EXT4 仍然胜过除 Reiser 之外的所有东西,由于 hans reiser 的当前状态,您可能不想使用它。
您可能想查看支持 NCQ 的驱动器,并确保您的安装设置为使用它。在繁重的搜索下,它应该提供速度提升。
最后,确保你的机器有大量的内存。由于文件不经常更新,如果有空闲空间,linux 最终会将它们中的大部分缓存到内存中。如果您的使用模式正确,这将为您带来巨大的速度提升。
我同意 Andrew 所说的大部分内容,但我会推荐Reiser4或更旧的(但得到更好的支持)ReiserFS。正如这些测试(以及 ReiserFS 的文档)所表明的那样,它专为您所询问的情况(大量小文件或目录)而设计。我过去在 Gentoo 和 Ubuntu 上使用过 ReiserFS,没有任何问题。
至于 Hans Reiser 的状态,我不认为这是文件系统本身的代码或稳定性问题。Reiser4 甚至得到了 DARPA 和 Linspire 的赞助,所以虽然我同意 Reiser 文件系统的进一步开发尚未确定,但我不认为这应该成为决定是否有人应该使用它的因素。
我知道这不是您问题的直接答案,但在这些情况下,我认为数据库可能更适合托管它。小文件可以二进制格式存储在数据库表中,并可以随意检索。使用这些文件的软件应该能够支持这一点......
Unix StackExchange 上的某个人创建了一个基准测试(带有源代码)来测试这种情况:
问:存储大量小文件(HDD,而不是 SSD)的最高性能 Linux 文件系统是什么?
最好的读取性能似乎来自 ReiserFS。
以我的经验,ext2 将 ext4 用于小文件。如果您不关心写入完整性,那就太好了。例如,subversion 创建了很多很多很多的小文件,ext4 和其他文件系统(XFS)会阻塞(运行一个 cron 作业,每半小时左右将数据从 ext2 rsync 到 ext4,实际上可以解决问题。)
运行这些命令可以使 ext2 更快(尽管这些选项中的大多数会使文件系统在崩溃后变得不稳定,除非您在崩溃之前运行同步)。这些命令对带有小文件的 ext4 几乎没有影响。
我猜想 ext3(或 ext4),也许 JFS 会是不错的解决方案。我会对 ext4 和 btrfs 保持警惕(文件系统很棘手——如果你想使用最新的东西,请准备好备份)。
您还可以在 mkfs 期间调整各种参数,以根据自己的喜好调整文件系统。
我当然会推荐反对XFS。不是因为它是一个糟糕的文件系统,而是因为创建/删除是一项昂贵的操作。
为避免目录搜索出现问题,请使用智能命名方案,例如:
或类似的,更复杂的方案。这将加快您的目录搜索速度,从而提高整体访问速度。(这是一个古老的 unix 技巧,我认为是从 V7 回来的)
大多数 FS 会在一个目录中被超过 65K 的文件阻塞,我认为 ext4 仍然如此。Reiser 文件系统没有这个限制(mp3.com 上的人付钱来确保这一点)。不确定其他任何事情,但这是 ReiserFS 的使用场景之一。