bugmenot77 Asked: 2009-07-21 10:45:51 +0800 CST2009-07-21 10:45:51 +0800 CST 2009-07-21 10:45:51 +0800 CST 文件系统 单个目录中的大量文件 772 好的,不是那么大,但我需要使用大约 60,000 个平均大小为 30kb 的文件存储在单个目录中的东西(这是一项要求,因此不能简单地分成文件数量较少的子目录)。 这些文件将被随机访问,但一旦创建,将不会写入同一个文件系统。我目前正在使用 Ext3,但发现它非常慢。有什么建议么? linux ext3 12 个回答 Voted Kamil Kisiel 2009-07-21T11:44:40+08:002009-07-21T11:44:40+08:00 您应该考虑 XFS。它在文件系统和目录级别都支持非常大量的文件,并且由于 B+ 树数据结构,即使在大量条目的情况下,性能也保持相对一致。 他们的 wiki 上有一个页面,其中包含大量详细介绍设计的论文和出版物。我建议您试一试,并根据您当前的解决方案对其进行基准测试。 nelaaro 2012-08-28T02:59:33+08:002012-08-28T02:59:33+08:00 Linux 上的 10 亿个文件 本文的作者深入研究了具有大文件数量的文件系统的一些性能问题,并对各种文件系统 ext3、ext4 和 XFS 的性能进行了一些很好的比较。这以幻灯片放映的形式提供。https://events.static.linuxfound.org/slides/2010/linuxcon2010_wheeler.pdf Ludwig Weinzierl 2009-07-21T10:57:56+08:002009-07-21T10:57:56+08:00 ext3 目录中的许多文件已在姊妹站点stackoverflow.com上进行了详细讨论 在我看来,ext3 上一个目录中的 60 000 个文件远非理想,但根据您的其他要求,它可能就足够了。 bugmenot77 2009-07-21T14:07:04+08:002009-07-21T14:07:04+08:00 好的。我使用 ReiserFS、XFS、JFS、Ext3(启用 dir_hash)和 Ext4dev(2.6.26 内核)做了一些初步测试。我的第一印象是一切都足够快(在我强大的工作站上)——事实证明,远程生产机器的处理器相当慢。 即使在最初的测试中,我也对 ReiserFS 感到有些奇怪,所以排除了这一点。似乎 JFS 的 CPU 需求比其他所有低 33%,因此将在远程服务器上进行测试。如果它表现得足够好,我会使用它。 Kyle Brandt 2009-07-21T11:54:20+08:002009-07-21T11:54:20+08:00 使用 tune2fs 启用 dir_index 可能会有所帮助。要查看它是否已启用: sudo tune2fs -l /dev/sda1 | grep dir_index 如果未启用: sudo umount /dev/sda1 sudo tune2fs -O dir_index /dev/sad1 sudo e2fsck -D /dev/sda1 sudo mount /dev/sda1 但我有一种感觉,你可能会走错路……为什么不生成一个平面索引并使用一些代码根据它随机选择。然后,您可以使用子目录来获得更优化的树结构。 hookenz 2011-02-24T17:34:11+08:002011-02-24T17:34:11+08:00 我正在编写一个应用程序,它还存储大量文件,尽管我的文件更大,并且我有 1000 万个文件,我将在多个目录中拆分。 ext3 很慢,主要是因为默认的“链表”实现。因此,如果您在一个目录中有很多文件,则意味着打开或创建另一个目录会变得越来越慢。有一种叫做 htree 索引的东西可用于 ext3,据报道它大大改进了事情。但是,它仅在文件系统创建时可用。见这里: http: //lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/ 由于无论如何您都将不得不重建文件系统并且由于 ext3 的限制,我的建议是您考虑使用 ext4(或 XFS)。我认为 ext4 使用较小的文件会更快一些,并且重建速度更快。据我所知,Htree 索引在 ext4 上是默认的。我对 JFS 或 Reiser 没有任何经验,但我听说过有人推荐过。 实际上,我可能会测试几个文件系统。为什么不试试 ext4、xfs 和 jfs,看看哪一个提供了最好的整体性能? 开发人员告诉我,可以在应用程序代码中加快速度的方法不是执行“stat + open”调用,而是执行“open + fstat”。第一个明显比第二个慢。不确定您是否对此有任何控制或影响。 请参阅我在 stackoverflow 上的帖子。 在 Linux 中存储和访问多达 1000 万个文件, 那里有一些非常有用的答案和链接。 koenigdmj 2009-07-21T11:18:04+08:002009-07-21T11:18:04+08:00 ext3 及以下支持每个目录最多 32768 个文件。ext4 在文件的实际计数中最多支持 65536 个,但允许您拥有更多(它只是不会将它们存储在目录中,这对于大多数用户而言并不重要)。 此外,目录存储在 ext* 文件系统上的方式本质上是一个大列表。在更现代的文件系统(Reiser、XFS、JFS)上,它们被存储为 B 树,这对于大型集合更有效。 kolypto 2009-07-21T12:12:49+08:002009-07-21T12:12:49+08:00 您可以存储文件 inode 而不是文件名:访问 inode 编号应该比解析文件名快得多 Marcin 2009-07-25T09:26:07+08:002009-07-25T09:26:07+08:00 你不想在一个目录中塞满那么多文件,你想要某种结构。即使它像拥有以文件的第一个字符开头的子目录一样简单,也可以改善您的访问时间。我喜欢使用的另一个愚蠢的技巧是强制系统使用元信息更新其缓存,即定期运行 updatedb。在一个窗口中运行slabtop,在另一个窗口中运行updatedb,你会看到很多内存将被分配给缓存。这种方式要快得多。 Gediz GÜRSU 2021-08-17T01:36:32+08:002021-08-17T01:36:32+08:00 BTRFS将非常实用。这里的问题似乎是小文件。NVME和 SSD 具有4K 块,非常适合该文件大小和非常快速地访问小文件。30Kb*60000 个文件平均为 1.7 GB,甚至不是 TB 级。因此,我建议使用带有 UPS 的ramdisk并使用rsync每 10 秒将其同步到 nvme 。它只同步更改的文件。重启后保持100 个左右的版本重新平衡。每 1 小时同步到一个单独的备份。 请记住,BTRFS 使用小文件会浪费大量空间 (%70),但空间并不是您需要担心的。 请注意,我在没有深入检查第一个答案的情况下写了这个。检查后,它证实了我的逻辑。
您应该考虑 XFS。它在文件系统和目录级别都支持非常大量的文件,并且由于 B+ 树数据结构,即使在大量条目的情况下,性能也保持相对一致。
他们的 wiki 上有一个页面,其中包含大量详细介绍设计的论文和出版物。我建议您试一试,并根据您当前的解决方案对其进行基准测试。
Linux 上的 10 亿个文件
本文的作者深入研究了具有大文件数量的文件系统的一些性能问题,并对各种文件系统 ext3、ext4 和 XFS 的性能进行了一些很好的比较。这以幻灯片放映的形式提供。https://events.static.linuxfound.org/slides/2010/linuxcon2010_wheeler.pdf
ext3 目录中的许多文件已在姊妹站点stackoverflow.com上进行了详细讨论
在我看来,ext3 上一个目录中的 60 000 个文件远非理想,但根据您的其他要求,它可能就足够了。
好的。我使用 ReiserFS、XFS、JFS、Ext3(启用 dir_hash)和 Ext4dev(2.6.26 内核)做了一些初步测试。我的第一印象是一切都足够快(在我强大的工作站上)——事实证明,远程生产机器的处理器相当慢。
即使在最初的测试中,我也对 ReiserFS 感到有些奇怪,所以排除了这一点。似乎 JFS 的 CPU 需求比其他所有低 33%,因此将在远程服务器上进行测试。如果它表现得足够好,我会使用它。
使用 tune2fs 启用 dir_index 可能会有所帮助。要查看它是否已启用:
如果未启用:
但我有一种感觉,你可能会走错路……为什么不生成一个平面索引并使用一些代码根据它随机选择。然后,您可以使用子目录来获得更优化的树结构。
我正在编写一个应用程序,它还存储大量文件,尽管我的文件更大,并且我有 1000 万个文件,我将在多个目录中拆分。
ext3 很慢,主要是因为默认的“链表”实现。因此,如果您在一个目录中有很多文件,则意味着打开或创建另一个目录会变得越来越慢。有一种叫做 htree 索引的东西可用于 ext3,据报道它大大改进了事情。但是,它仅在文件系统创建时可用。见这里: http: //lonesysadmin.net/2007/08/17/use-dir_index-for-your-new-ext3-filesystems/
由于无论如何您都将不得不重建文件系统并且由于 ext3 的限制,我的建议是您考虑使用 ext4(或 XFS)。我认为 ext4 使用较小的文件会更快一些,并且重建速度更快。据我所知,Htree 索引在 ext4 上是默认的。我对 JFS 或 Reiser 没有任何经验,但我听说过有人推荐过。
实际上,我可能会测试几个文件系统。为什么不试试 ext4、xfs 和 jfs,看看哪一个提供了最好的整体性能?
开发人员告诉我,可以在应用程序代码中加快速度的方法不是执行“stat + open”调用,而是执行“open + fstat”。第一个明显比第二个慢。不确定您是否对此有任何控制或影响。
请参阅我在 stackoverflow 上的帖子。 在 Linux 中存储和访问多达 1000 万个文件, 那里有一些非常有用的答案和链接。
ext3 及以下支持每个目录最多 32768 个文件。ext4 在文件的实际计数中最多支持 65536 个,但允许您拥有更多(它只是不会将它们存储在目录中,这对于大多数用户而言并不重要)。
此外,目录存储在 ext* 文件系统上的方式本质上是一个大列表。在更现代的文件系统(Reiser、XFS、JFS)上,它们被存储为 B 树,这对于大型集合更有效。
您可以存储文件 inode 而不是文件名:访问 inode 编号应该比解析文件名快得多
你不想在一个目录中塞满那么多文件,你想要某种结构。即使它像拥有以文件的第一个字符开头的子目录一样简单,也可以改善您的访问时间。我喜欢使用的另一个愚蠢的技巧是强制系统使用元信息更新其缓存,即定期运行 updatedb。在一个窗口中运行slabtop,在另一个窗口中运行updatedb,你会看到很多内存将被分配给缓存。这种方式要快得多。
BTRFS将非常实用。这里的问题似乎是小文件。NVME和 SSD 具有4K 块,非常适合该文件大小和非常快速地访问小文件。30Kb*60000 个文件平均为 1.7 GB,甚至不是 TB 级。因此,我建议使用带有 UPS 的ramdisk并使用rsync每 10 秒将其同步到 nvme 。它只同步更改的文件。重启后保持100 个左右的版本重新平衡。每 1 小时同步到一个单独的备份。
请记住,BTRFS 使用小文件会浪费大量空间 (%70),但空间并不是您需要担心的。
请注意,我在没有深入检查第一个答案的情况下写了这个。检查后,它证实了我的逻辑。