为什么 ext4 不缓存目录大小?

为什么 ext4 不缓存目录大小?

我再次清理我的桌面,因为我的硬盘空间不足,而且每次我调用时du -sh ~,都需要很长时间来计算目录的当前大小。

从我的角度来看,我看不出 ext4 文件系统为什么不缓存有关目录大小的信息并在创建/删除文件时更新它。然后,该信息将暴露给系统,并最终暴露给用户。当然,它需要将目录大小数据传播到目录树上,但我无法想象在普通 Linux 桌面上它会导致任何问题的情况。

我哪里做错了?

答案1

简单的缓存不起作用。缓存用于检查您是否已经有答案,如果没有,则重新处理。但在这种情况下,一个丢失的条目会使其他条目变得毫无用处。因此它必须保留全部目录大小已更新全部时间。

另外,不要低估你的建议可能产生的影响。当日志文件系统刚刚出现时,有很多反对意见,因为更新日志的成本太高。此外,大多数文件系统允许诸如noatimenodiratime和之类的选项relatime,以减少这些类型的元数据更新。请注意,所有这些(日志和时间更新)都与时间有关,它们都需要特定数量的块访问(通常被高级 IO 调度“隐藏”),但更新每一个路径上的目录意味着未知数量的访问。

最后,在 POSIX 文件系统中,没有真正的“包含目录”。目录上的文件条目指向 inode(保存文件信息的磁盘结构),但没有从 inode 到目录的引用。这允许使用“硬链接”功能,其中多个条目(通常在不同的目录中)指向同一个 inode。即使您保留了指向 inode 的目录列表,您也会使(已经很大的)更新数量成倍增加。更糟糕的是,现在您必须跟踪是否已经更新了每个目录,因为在链的某个点上,您将获得一个共享祖先,这不应该计算更新的两倍。或者应该吗?也许你必须保留每个目录的大小,一个用于计算所有“真实”文件,另一个用于计算每次出现的文件数......

它看上去终究没那么有用。

答案2

还有另一个原因。du没有考虑子系统的一部分是否位于您正在测量的目录中安装的另一个卷上。

因此,即使按卷评估使用情况,du也不会利用它。另一方面,df利用此类信息....

相关内容