一个ext3目录中的最大文件数,同时仍能获得可接受的性能?


25

我有一个应用程序写入ext3目录,随着时间的推移,该目录已增长到大约300万个文件。不用说,读取此目录的文件列表的速度令人难以忍受。

我不怪ext3。正确的解决方案是让应用程序代码写入子目录,例如./a/b/c/abc.ext而不是only ./abc.ext

我正在更改为这样的子目录结构,而我的问题很简单:我希望在一个ext3目录中存储多少文件,同时仍然可以获得可接受的性能?您的经验是什么?

或者换句话说;假设我需要在结构中存储300万个文件,该结构应深入多少层./a/b/c/abc.ext

显然,这是一个无法完全回答的问题,但是我正在寻找一个估计的数字。

Answers:



10

非常小心,你如何选择目录拆分。“ a / b / c”听起来像是对我造成灾难的秘诀...

不要盲目地制作几个目录的深层结构,例如,第一层为100个条目,第二层为100个条目,第三层为100个条目。我去过那里,做了那件事,当性能下降到只有几百万个文件时,不得不重新整理夹克。:-)

我们有一个进行“多个目录”布局的客户端,最终每个目录只放置一到五个文件,这正在杀死它们。3至6个小时在此目录结构中执行“ du”操作。这里的救星是SSD,他们不愿意重写应用程序的这一部分,而SSD将这段时间从几小时缩短到了几分钟。

问题是目录查找的每个级别都要进行搜索,而搜索非常昂贵。目录的大小也是一个因素,因此,使目录变小而不是变大是一个大胜利。

为了回答有关每个目录有多少个文件的问题,我听说有1,000个文件被称为“最佳”文件,但性能最好为10,000个文件。

因此,我建议您使用一个目录级别,每个级别是一个目录,该目录长2个字符,由大写和小写字母以及数字组成,用于顶层的大约3800个目录。然后,您可以保存包含这些子目录的14M文件,这些子目录包含3800个文件,对于3M文件,每个子目录大约包含1,000个文件。

我为另一个客户进行了这样的更改,它产生了巨大的变化。


6

我建议您尝试使用基准测试工具(例如postmark)测试各种目录大小,因为有很多变量(例如缓存大小)(在OS和磁盘子系统中)都取决于您的特定环境。

我个人的经验法则是目标目录大小为<= 2万个文件,尽管我已经看到相对不错的性能,每个目录最多有10万个文件。


3

我的所有文件都进入文件夹,例如:

上传/ [日期] / [小时] /yo.png

并且没有任何性能问题。


4
每小时可获得多少文件?
卡斯卡贝尔


2

我可以确认,在一台功能强大且功能强大的服务器上,在适当的负载下有大量内存,其中70,000个文件可能造成各种破坏。我去掉了一个包含70k文件的缓存文件夹,这导致apache开始生成新实例,直到它达到255,并且系统使用了所有可用内存(16gb,尽管虚拟实例可能更低)。无论哪种方式,将其保持在25,000以下可能都是非常谨慎的做法


1

以我的经验,最好的方法是不要预先过度设计文件结构。正如至少一个其他答案中提到的那样,存在一些文件系统扩展来处理性能问题。

我最常遇到的问题是管理端的可用性。您减少目录中文件数量所能做的最少工作就是您现在需要的方法。

sqrt(3_000_000)== 1732

在一个目录中有数千个文件对我来说听起来很合理。做自己的判断自己的情况。为此,请尝试将文件分成单个级别的哈希目录,以使每个目录的平均文件数与目录数大致相同。

鉴于您的例子,这将是./a/abc.ext./ab/abc.ext./abc/abc.ext,...。

文件的传播将在很大程度上取决于实际的文件名。想象一下,将这种技术应用于一百万个文件目录,每个文件名为foobar???.txt。有一些方法可以实现更均匀的扩展,例如基于每个文件名的MD5总和中特定数量的位的值进行散列,但是我敢于猜测这对于您要实现的目标而言是过高的。


1

嗯,我最近看了这篇文章。本质上,您可以利用自己喜欢的哈希算法的分布。我开始使用数字,一个MySQL签名的INT的最大值为2147483647。您还可以更改每个目录的所需文件数和子目录数,以最终的子目录数/文件数为准。给定数据集的按目录拆分,但是很难找到有关最佳目录/文件组织的经验证据。 本文确实提供了有关文件系统之间性能差异的一些见解(一些有趣的指标),但没有关于最佳组织的任何见解。


0

我认为您对此投入了过多的思考。如果您甚至选择了一个附加级别的目录,并且能够均衡地平衡所有内容,则每个目录将有1732 *个目录和1732个文件。

除非您计划需要数百亿个文件,否则您几乎可以选择一个介于1000到100,000之间的数字并获得良好的结果。

* 300万的平方根。

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.