我有一个应用程序写入 ext3 目录,随着时间的推移,该目录已增长到大约 300 万个文件。不用说,读取这个目录的文件列表是非常慢的。
我不怪 ext3。正确的解决方案是让应用程序代码写入子目录,./a/b/c/abc.ext
而不是仅使用./abc.ext
.
我正在更改为这样的子目录结构,我的问题很简单:我应该在一个 ext3 目录中存储大约多少个文件,同时仍然可以获得可接受的性能?你有什么经验?
或者换句话说;假设我需要在结构中存储 300 万个文件,那么结构应该有多深./a/b/c/abc.ext
?
显然这是一个无法准确回答的问题,但我正在寻找一个球场估计。
如果您有一个支持该
dir_index
功能的发行版,那么您可以轻松地在一个目录中拥有 200,000 个文件。不过,为了安全起见,我会将其保持在 25,000 左右。如果没有dir_index
,请尝试将其保持在 5,000。非常小心如何选择目录拆分。“a/b/c”对我来说听起来像是灾难的秘诀……
不要盲目地做几个目录深度结构,比如第一级有 100 个条目,第二级有 100 个条目,第三级有 100 个条目。我去过那里,做到了,得到了夹克,当性能因数百万个文件而陷入困境时,我不得不对其进行重组。:-)
我们有一个客户端进行“多个目录”布局,最终每个目录只放置一到五个文件,这正在杀死它们。在这个目录结构中做一个“du”需要 3 到 6 个小时。这里的救星是 SSD,他们不愿意重写这部分应用程序,而 SSD 将这个 du 时间从几小时缩短到几分钟。
问题是目录查找的每一级都需要查找,而且查找非常昂贵。目录的大小也是一个因素,所以让它更小而不是更大是一个很大的胜利。
要回答您关于每个目录有多少文件的问题,我听说 1,000 被称为“最佳”,但 10,000 的性能似乎还不错。
所以,我推荐的是一级目录,每一级是一个 2 个字符长的目录,由大小写字母和数字组成,顶层大约有 3800 个目录。然后,您可以使用包含 3800 个文件的子目录保存 14M 文件,或者对于 3M 文件,每个子目录大约 1,000 个文件。
我为另一个客户做了这样的改变,它产生了巨大的变化。
我建议您尝试使用诸如postmark之类的基准测试工具测试各种目录大小,因为有很多变量,例如缓存大小(在操作系统和磁盘子系统中)取决于您的特定环境。
我个人的经验法则是将目录大小设为 <= 20k 个文件,尽管我已经看到最多 100k 个文件/目录的性能相对不错。
我将所有文件都放在以下文件夹中:
上传/[日期]/[小时]/yo.png
并且没有任何性能问题。
http://en.wikipedia.org/wiki/Ext3#Functionality - 这提到一个目录只能有大约 32000 个子目录,但没有提到文件。
http://roopindersingh.com/2008/05/10/ext3-handling-large-number-of-files-in-a-directory/
另外,我讨厌专家交流,但我读到了关于这个问题的评论,每个目录最好少于 10-15,000 个。
我可以在一个相当强大的服务器上确认,在相当大的负载下有足够的内存,70,000 个文件可能会造成各种破坏。我删除了一个包含 70k 文件的缓存文件夹,它导致 apache 开始生成新实例,直到它达到 255 个最大值并且系统使用了所有可用内存(16gb,尽管虚拟实例可能更低)。无论哪种方式,将其保持在 25,000 以下可能是一个非常谨慎的举措
根据我的经验,最好的方法是不要提前过度设计文件结构。正如至少在另一个答案中提到的那样,有一些文件系统扩展可以处理性能问题。
我经常遇到的问题是管理端的可用性。您可以做的最少的工作来减少目录中的文件数量可能是您现在需要的方法。
sqrt(3_000_000) == 1732
一个目录中的几千个文件对我来说听起来很合理。做你自己的判断你自己的情况。为此,请尝试将文件拆分为单级哈希目录,以便每个目录的平均文件数与目录数大致相同。
鉴于您的示例,这将是
./a/abc.ext
,./ab/abc.ext
,./abc/abc.ext
, ... 。文件的传播很大程度上取决于实际的文件名。想象一下,将这种技术应用于包含一百万个文件的目录,每个文件名为
foobar???.txt
. 有一些方法可以实现更均匀的传播,例如基于每个文件名的 MD5 总和中特定位数的值的散列,但我敢猜测这对于你想要完成的事情来说太过分了。嗯,最近看了这篇文章。本质上,您利用了您最喜欢的散列算法的分布。我开始玩这些数字,MySQL 签名的 INT 的最大值为 2147483647。您还可以改变每个目录所需的文件数和子目录数来确定最终的子目录/文件数-给定数据集的每个目录拆分,但很难找到关于最佳目录/文件组织的经验证据。 本文确实对跨文件系统的性能差异(一些有趣的指标)提供了一些见解,但没有关于最佳组织的内容。
我觉得你在这方面考虑太多了。如果您甚至选择了一个附加级别的目录并且能够平衡平衡,那么您将拥有 1732* 个目录和每个目录 1732 个文件。
除非您计划需要数百亿个文件,否则您几乎可以在 1000 到 100,000 之间选择一个数字并获得良好的结果。
* 300 万的平方根。