子目录的数量如何影响 Linux 上的驱动器读/写性能?

子目录的数量如何影响 Linux 上的驱动器读/写性能?

我在 Linux CentOS 服务器上有一个 EXT3 格式的驱动器。这是一个 Web 应用数据驱动器,包含每个用户帐户的目录(共有 25,000 个用户)。每个文件夹都包含该用户上传的文件。总的来说,这个驱动器上有大约 250GB 的数据。

用所有这些目录构建驱动器是否会影响驱动器的读/写性能?它是否会影响我不知道的其他一些性能方面?

以这种方式构建事物是否存在内在错误或不良之处?也许只是文件系统选择错误?

我最近尝试合并两个数据驱动器,发现 EXT3 限制为 32,000 个子目录。这让我想知道为什么。我这样构建它似乎很愚蠢,因为每个文件都有一个与数据库中的 ID 相对应的唯一 ID。唉……

答案1

这很容易自己测试选项,在你的环境中并比较结果。是的,随着目录数量的增加,性能会受到负面影响。是的,其他文件系统可以帮助绕过这些障碍或减少影响。

XFS 文件系统更适合这种类型的目录结构。ext4 现在可能就很好了。随着子目录和文件数量的增加,对目录的访问和操作将变得更慢。这是非常在 ext3 下发音较多,但在 XFS 上发音不多。

答案2

答案并不像文件系统的选择那么简单。健全的文件系统很久以前就不再使用线性列表作为目录,这意味着目录中的条目数不会影响文件访问时间……

除非它确实发生了。

事实上,无论条目数量有多少,每个操作都保持快速和高效,但有些任务涉及越来越多的操作。显然,执行一个简单的操作ls需要很长时间,而且直到读取和排序所有 inode 后您才会看到任何东西。执行ls -U(unsorted) 有点帮助,因为您可以看到它没有死,但并没有明显减少时间。不太明显的是,任何通配符扩展都必须检查每个文件名,而且在大多数情况下似乎还必须读取整个 inode。

简而言之:如果您可以肯定没有任何应用程序(包括 shell 访问)会使用任何通配符,那么您可以毫无顾忌地获得巨大的目录。但如果代码中可能隐藏着一些通配符,最好将每个目录保持在 1000 个条目以下。

编辑

所有现代文件系统都使用良好的数据结构来处理大目录,因此,只需执行一个操作即可找到某个目录的 inode具体的即使在巨大的目录中,文件也会非常快。

但是,大多数应用程序并不只执行单一操作。它们中的大多数会执行完整目录或通配符匹配。无论如何,这些操作都很慢,因为它们涉及读取所有条目。

例如:假设您有一个目录,其中包含一百万个文件,从“foo-000000.txt”到“foo-999999.txt”,以及一个“natalieportman.jpeg”。这些文件会很快:

  • ls -l foo-123456.txt
  • open "foo-123456.txt"
  • delete "foo-123456.txt"
  • create "bar-000000.txt"
  • open "natalieportman.jpeg"
  • create "big_report.pdf"

这些都会失败,而且失败得很快:

  • ls -l bar-654321.txt
  • open bar-654321.txt
  • delete bar-654321.txt

即使它们返回很少的结果,这些也会很慢;即使是失败的,也会在扫描所有条目后失败:

  • ls
  • ls foo-1234*.txt
  • delete *.jpeg
  • move natalie* /home/emptydir/
  • move *.tiff /home/seriousphotos/

答案3

首先确保 ext3 分区已dir_index设置标志。

sudo dumpe2fs /dev/sdaX |grep --color dir_index

如果缺失,您可以启用它。您需要卸载文件系统,然后运行:

sudo tune2fs -O dir_index /dev/sdaX
sudo e2fsck -Df /dev/sdaX

然后挂载文件系统。

答案4

单个目录中的条目(文件和目录)越多,访问速度就越慢。每个文件系统都是如此,尽管有些文件系统比其他文件系统更糟糕。

更好的解决方案是创建一个目录层次结构,如下所示:

/users/a/aaron/
/users/a/andrew/
/users/b/betty/
/users/b/brian/

如果你仍然需要更好的性能,你可以扩展多个级别:

/users/a/a/aaron
/users/a/n/anna
/users/a/n/andrew

大多数邮件系统在其邮件队列文件中都使用此技巧。

此外,我发现对于某些文件系统,如果目录中过去有很多条目,则会使该目录的访问速度变慢。对ls -ld目录执行检查,查看目录条目本身的大小。如果目录条目大小为几 MB 或更多,并且目录相对空,则可能是性能不佳。重命名目录,创建一个具有相同名称、权限和所有权的新目录,然后将旧目录的内容移动到新目录中。我多次使用这个技巧来显著加快因文件系统而变慢的邮件服务器的速度。

相关内容