对大型目录树执行 rm -rf 需要几个小时

对大型目录树执行 rm -rf 需要几个小时

我们使用 rsnapshot 进行备份。它保留了大量备份文件的快照,但会删除旧快照。这很好。但是,对rm -rf大量目录树执行备份大约需要 7 个小时。文件系统是 XFS。我不确定有多少文件,但可能有数百万个。

有什么办法可以加快速度吗?有没有命令可以达到同样的效果,rm -rf而且不需要花费数小时?

答案1

不。

rm -rf对文件系统进行递归深度优先遍历,调用unlink()每个文件。导致进程缓慢的两个操作是opendir()/readdir()unlink()opendir()并且readdir()取决于目录中的文件数。unlink()取决于被删除文件的大小。使此过程更快的唯一方法是减少文件的大小和数量(我怀疑这不太可能)或将文件系统更改为具有更好操作特性的文件系统。我相信 XFS 适合在大型文件上使用 unlink(),但不适合大型目录结构。您可能会发现 ext3+dirindex 或 reiserfs 更快。我不确定 JFS 的表现如何,但我确信有很多不同文件系统性能的基准。

编辑:看来XFS 在删除树方面表现糟糕,所以一定要改变你的文件系统。

答案2

或者,将目录移到一边,使用相同的名称、权限和所有权重新创建它,然后重新启动关心该目录的任何应用程序/服务。

然后,您可以在后台“nice rm”原始目录,而不必担心长时间中断。

答案3

确保您已为 XFS 设置正确的挂载选项。

使用 -ologbufs=8,logbsize=256k 和 XFS 可能会使您的删除性能提高三倍。

答案4

如果您在文件级别有效地执行 rm,则需要很长时间。这就是基于块的快照如此出色的原因:)。

您可以尝试将 rm 拆分为不同的区域并尝试并行执行,但我可能不认为这会有任何改善。众所周知,XFS 在删除文件时存在问题,如果这是您所做的大部分工作,那么为此使用不同的文件系统可能是一个好主意。

相关内容