Linux 文件系统

zuk*_*uk1 2 linux filesystems

这与我在 StackOverflow 上发布的一个问题有关:

/sf/ask/84053791/

如果您阅读 Paul Alan Taylor 的回答中的评论,您就会明白我在说什么。

这是我的示例文件夹结构:

主文件夹包含 100,000 个子文件夹,每个子文件夹包含大约 20 个文件。我的问题是,如果在我的 Web 服务器上请求文件(通过浏览器)时,如果它位于这些子目录之一中,我会遇到性能问题吗?

Ave*_*yne 11

您遇到了一个众所周知的问题。虽然有些文件系统可以容纳数百万个文件(Linux 上的 XFS 和 ReiserFS,Windows 上的 NTFS),但它们仍然需要在文件名堆栈中筛选以搜索该文件。仅仅因为它可以容纳这么多文件并不意味着它会很快。我在一个只有数万个文件的 Windows 服务器上请求了文件属性,这几乎是一个“去吃午饭然后回来”的交易。我还试图通过列出一个目录ls,发现其中的 20,000 个奇怪的文件需要在繁忙的服务器上处理大约 2 分钟(文件系统是 Ext3)。

幸运的是,有一个解决方案,尽管它可能与您期望的略有不同。

使用其他子目录。

这是一种众所周知的策略,并已成功用于各种程序中。例如,出于同样的原因Squid使用子目录层来处理完全相同的问题- 需要快速访问数十万个文件。通过仅使用一层额外的目录,他们可以轻松管理数百万

它在您期望的网页中也更常见。每次看到类似这样的 URL 时(加粗以强调):

http://www.somelargenewssite.com/articles/ 9月8日/ A4 /gibberish-page-key-abc123.html

......它实现了相同的效果。这不是关于按年和月跟踪文章,而是关于通过减少网络服务器花在寻找页面上的时间来提高客户端上的页面加载性能。

如果可能,请避免每个目录包含 100,000 个文件。尝试以 1,000 - 10,000 为目标。如果您不确定如何完成此操作,只需取文件的第一个字母并将其设为附加目录,即

http://mysite.com/subpage/abcdefg1234567.php
Run Code Online (Sandbox Code Playgroud)

变成

http://mysite.com/subpage/a/abcdefg1234567.php
Run Code Online (Sandbox Code Playgroud)

如果这不会减少您的文件数量,您可以使用第二个字母或第三个字母等,直到您将文件数量减少到可管理的大小。

http://mysite.com/subpage/a/b/c/abcdefg1234567.php
Run Code Online (Sandbox Code Playgroud)

此过程需要您进行最少的编码,仅凭文件名就很容易适应,并且无论您使用何种文件系统,都将改善您的访问时间。