在巨大的目录树上执行 rm -rf 需要几个小时

Ama*_*rus 21 files performance filesystems rsnapshot

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

有没有办法加快速度?是否有任何命令可以执行相同的操作rm -rf并且不需要花费数小时和数小时?

Dav*_*ley 39

不。

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

编辑:似乎XFS 在删除 tree 方面很糟糕,所以一定要改变你的文件系统。

  • 它几乎只是说“不”:) (2认同)
  • 除了您关于取消链接速度取决于文件大小的说法之外,我同意这里的所有内容。unlink 只是删除文件的链接,对实际内容没有任何作用。不同大小的文件之间应该没有明显的区别(您可以自己测试)。 (2认同)

Gre*_*ork 25

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

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


Jam*_*mes 8

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

在 XFS 中使用 -ologbufs=8,logbsize=256k 可能会使您的删除性能增加三倍。

  • +1 此提示...还应该启用惰性计数器以提高性能。 (2认同)
  • 对这些设置的一些解释将对未来的读者有所帮助。 (2认同)

Jam*_*mes 5

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

您可以尝试将 rm 拆分为单独的区域并尝试并行执行,但是我可能不希望它有任何改进。众所周知,XFS 在删除文件时会遇到问题,如果这是您所做工作的很大一部分,那么可能会考虑使用不同的文件系统。


ash*_*108 5

无论使用什么文件系统,都可以将 ionice 用于诸如此类的 IO 密集型操作。
我建议这个命令:

ionice -n7 nice rm -fr dir_name

它将很好地用于具有大量 IO 负载的服务器上的后台操作。