同一文件夹中的文件数量如何影响 ext4 文件系统的 I/O 性能

同一文件夹中的文件数量如何影响 ext4 文件系统的 I/O 性能

我在用着京都内阁(键值存储)用于我的项目。我使用的特定类型的数据库是目录数据库这会在一个目录中创建大量文件来存储键值对。我运行此项目的服务器具有 ext4 文件系统。我遇到的问题是,随着目录中文件数量的增加,I/O 延迟也会增加。此外,当目录中的文件太多(例如超过 100 万个文件)时,当我尝试删除整个文件夹时,它会花费很长时间(已经超过 5 个小时并且仍在运行)。有人可以解释为什么 I/O 延迟会随着文件数量的增加而增加,以及为什么 rm 需要很长时间才能删除文件夹吗?

答案1

延迟最简单的例子是,显然,列出整个目录的时间会随着目录的大小而变化。

其次,根据文件系统设置,ext4 使用链接列表或散列 B 树进行目录查找。您只需查看这两种数据结构的工作原理,即可了解错误配置可能造成的差异。简而言之,链接列表非常慢,只适用于小型目录,而散列速度更快,更适合大型目录。

处理链表意味着遍历列表中的每个项目,因为大多数时候,只有项目 n-1 知道项目 n 在哪里,因此您必须先读取项目 n。

处理哈希树涉及在内存中计算一个数字,并根据该数字直接跳转到详细信息。虽然对于大型目录,可能需要执行几次此操作,但这比处理每个节点要快得多。

无论如何,如果你真的想了解细节,所有的文档都可以在网上找到。例如,你可以从这里开始:https://ext4.wiki.kernel.org/index.php/Ext4_Disk_Layout#Hash_Tree_Directories

相关内容