为什么在一个仅服务于静态 Web 请求的目录中不应有太多文件?

AGa*_*yer 6 linux filesystems web-server

这可能是一个非常笼统的问题,但我真的很想找到一些详细的答案或线索。

我正在和一位朋友讨论这个问题,试图说服他将 300,000 多个文件从一个文件夹放到多个文件夹中(例如每个子目录 1000 个)。这些文件是图像,可以在线浏览网页,例如:

www.example.com/folder/1.png
.
.
.
www.example.com/folder/300000.png
Run Code Online (Sandbox Code Playgroud)

我只记得多年前,我在像 Youtube 这样的在线视频服务公司工作。我们将屏幕截图放在一个文件夹中,然后服务器总是崩溃。当时有“谣言”说人们不应该将多个文件放在一个文件夹中,但我们不知道详细原因。

那么我应该在一个文件夹中放多少个文件呢?如果有限制,为什么?有什么推荐的设计方法吗?

我的服务器信息:

No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 7.8 (wheezy)
Release:    7.8
Codename:   wheezy
Run Code Online (Sandbox Code Playgroud)

核心构建版本:

Linux linode 4.1.5-x86_64-linode61 #7 SMP Mon Aug 24 13:46:31 EDT 2015 x86_64 GNU/Linux
Run Code Online (Sandbox Code Playgroud)

我想这种情况适用于许多不同类型的服务器软件。

Mic*_*ton 12

这对于XFS 和 ext4 等较新的文件系统来说并不是什么大问题,但在较旧或配置错误的文件系统上,这可能是一个严重的问题。


对于 ext3 等较旧的 Linux 文件系统,目录只是文件的无序列表。

它是无序的很重要,因为这意味着系统在目录中查找文件的唯一方法是从头到尾搜索它。

如果一个目录包含 3,000 个文件,则平均需要 1,500 次比较才能在该目录中找到一个随机文件。但如果目录包含 300,000 个文件,则平均需要 150,000 次比较才能在该目录中找到随机文件。

在任何一种情况下,如果目录条目尚未缓存在 RAM 中,则必须从磁盘加载它,这将增加大量的文件访问时间,与目录的大小成正比。显然,小 dentry 可以比大 dentry 加载得更快。

因此,它是快,当你使用更分层目录结构将大量的文件分成独特的目录。

XFS 不会遇到这个问题,因为它使用哈希表来查找目录条目。因此,它几乎可以像处理一个文件的目录一样轻松地处理包含数十万个文件的目录。但是它仍然需要从磁盘加载更大的数据结构。不过,如果系统中有足够的 RAM,这实际上并不是一个实际问题。

Ext4 还使用散列目录索引。