【问题标题】:Do many files in a single directory cause longer loading time under Apache?单个目录中的许多文件是否会导致 Apache 下的加载时间更长?
【发布时间】:2017-04-18 15:52:26
【问题描述】:

即使似乎存在一些重复的问题,我认为这个问题是独一无二的。我不是在问是否有任何限制,它只是关于 Apache 环境中的性能缺陷。或者一般的unix文件系统。

假设我从 Apache 服务器请求文件

http://example.com/media/example.jpg

同一个目录“media”中有多少文件有关系吗?

我问的原因是我的 PHP 应用程序动态生成图像。

创建后,它会将其放置在 PHP 脚本因 ModRewrite 而触发的相同位置。如果文件存在,Apache 将跳过整个 PHP 执行并直接提供静态图像。如果你想这样称呼它,某种网关缓存。

Apache 基本上有两件事要做:

  1. 检查文件是否存在
  2. 提供文件或将请求转发给 PHP

到目前为止,我在这个单个目录中有大约 8 GB 的大约 25.000 个文件。我预计它在未来几年至少会增长 10 倍。

虽然我在管理这些文件时没有遇到任何问题,但我有一种轻微的感觉,即通过 HTTP 请求它们时它会变得越来越慢。所以我想知道这是否真的发生了,或者这只是我的主观印象。

【问题讨论】:

  • 这取决于文件系统以及它如何在目录中搜索文件;如果它使用线性搜索,它会很慢,如果它被索引,文件的数量就不是问题了。它并不是真正特定于 Apache(或任何其他服务器)。对于 unix.SE 或 ServerFault.com,这可能是一个更好的问题。
  • 好吧,是的,你是对的。基本上,搜索更大的文件集总是需要更长的时间。我想也许文件系统可以神奇地优化或缓存文件请求,从而使它们的实际层次结构过时。
  • 事实上有一个目录缓存,所以它没有我建议的那么糟糕。但是将大目录加载到缓存中也很昂贵。
  • 单个目录中有太多文件通常不是一个好主意。我可以建议您将它们分隔在子目录中吗?在生成文件名时,您还可以使用一些策略将文件放在从其名称推导出的目录中(如一些哈希函数)。

标签: php apache unix


【解决方案1】:

大多数基于 Berkeley FFS 的文件系统会因多个间接级别而导致性能下降,因为一个目录中有大量文件。

我不了解 HFS 或 NTFS 等其他文件系统,但我怀疑它们很可能会遇到同样的问题。

我曾经不得不处理类似的问题并最终使用文件映射。

我认为它类似于 md5 myfilename-00001 yielding(例如):e5948ba174d28e80886a48336dcdf4a4 然后我将其放入名为 e5/94/8ba174d28e80886a48336dcdf4a4 的文件中。然后映射文件将“myfilename-00001”映射到“e5/94/8ba174d28e80886a48336dcdf4a4”。这个不太优雅的解决方案适合我的目的,只需要一点代码。

【讨论】:

  • 感谢您的回答。问题不在于我不知道如何将这些文件拆分为多个目录,我只是想知道它是否有必要。是的,似乎是:)
猜你喜欢
  • 2018-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2015-10-29
  • 2021-10-19
相关资源
最近更新 更多