为什么在一个目录中不应该有太多文件只提供静态web请求?

这可能是一个非常普遍的问题,但我真的很想find一些详细的答案或线索。

我正在和一个朋友讨论这个问题,试图说服他从一个文件夹中将超过30万个文件放到多个文件夹中(比如每个子目录1000个)。 这些文件是图像,并在网上观看,如:

www.example.com/folder/1.png . . . www.example.com/folder/300000.png 

我只记得很多年前,我在Youtube等在线video服务公司工作。 我们把截图放在一个文件夹中,然后服务器总是崩溃。 当时一个“谣言”说不应该把多个文件放在一个文件夹中,但是我们不知道详细的原因。

那么我应该把多less个文件放在一个文件夹里? 如果有限制,为什么? 任何build议的方式来devise这个?

我的服务器信息:

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

Core Build版本:

 Linux linode 4.1.5-x86_64-linode61 #7 SMP Mon Aug 24 13:46:31 EDT 2015 x86_64 GNU/Linux 

我想这个案例适用于许多不同types的服务器软件。

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


对于较旧的Linux文件系统(如ext3),目录只是一个无序的文件列表。

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

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

在任何一种情况下,如果目录条目没有被caching在RAM中,则它必须从磁盘加载,这将为文件访问增加大量的时间,与目录的大小成比例。 显然,一个小的dentry可以比一个大的更快加载。

因此,当您使用更分层的目录结构将大量文件分隔成独特的目录时,速度会更快。

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

Ext4也使用散列的目录索引。

当单个目录包含许多(数十或数十万甚至数百万个)文件或子目录时,许多文件系统会变慢,甚至可能还有一个硬性的上限,但是如果和多less依赖于两者您select的文件系统以及哪个IO操作。 查看维基百科, 了解文件系统function的比较 。

很明显,用多个文件列出和分类一个目录将会更加昂贵,但即使通过名称来检索文件对于更大的目录也会变得更加昂贵。

一个常见的解决scheme是创build一个基于或从文件名派生的多级子目录结构 。

这是多么重要取决于您使用的文件系统,有时还取决于您的存储如何实现的其他方面。 这也可能取决于使用的模式。

当文件数量超过1000个时,一些较老的文件系统的性能非常糟糕。 这对于较新的文件系统来说不是那么简单,但不是一个完整的非问题。

有了大量的文件,目录节点会变大。 每次改变都需要重写。 这可能是一个性能问题。

如果您的存储是联网的,则与写入目录相关的locking可能成为问题。 例如,如果您有一组Web服务器共享一个大目录,用于存储会在每个Web命中发生更改的会话文件,这可能会非常糟糕,基本上是在进程等待locking目录节点时对其进行串行化访问。 将会话文件散列到较小的目录意味着大多数会话文件访问不会在给定的会话写入上需要locking。