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


20

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

反正有加快它的速度吗?是否有任何命令rm -rf与不需要花费数小时的时间相同?


1
我用过find . -delete -name directory,而且速度比快得多rm -rf
Paolo

Answers:


38

没有。

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

编辑:看来XFS可怕的是删除trees,所以一定要更改您的文件系统。


1
几年前,我注意到在类似的用例中使用reiserfs的性能很差。
knweiss

1
奇妙的帖子!
wzzrd

2
它几乎只是说了“不” :)
David Pashley 09年

2
我同意这里的所有内容,除了您的声明,即取消链接的速度取决于文件的大小。取消链接只会删除到文件的链接,而对实际内容没有任何作用。不同大小的文件之间应该没有明显的区别(您可以自己测试)。
卡米尔·基西尔

@KamilKisiel您说的没错unlink,除了执行unlink系统调用外,它对实际内容没有任何作用,但是,如果删除的链接是文件的最后一个链接,并且当前未打开,则文件系统代码还有更多工作要做。这当然取决于文件系统,但是当删除的文件很大时,可能会有非常明显的区别。
jlliagre

22

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

然后,您可以在后台“精简rm”原始目录,而不必担心长时间的停机。


这可以工作,因为mv非常快。
罗里

是的-它运作良好。我已经多次使用这种技术来“修复”基于maildir的邮箱,在该邮箱中,电子邮件客户端已经失去了头脑,并在磁盘上留下了混乱。我以这种方式修复的最大(单个)目录具有大约1.5或200万个文件IIRC。最终用户的总停机时间约为3分钟,其中大部分时间在等待邮件客户端和imap进程终止。
格雷格作品

7

确保为XFS设置了正确的安装选项。

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


2
+1提示...还应启用惰性计数器以提高性能。
hurikhan77

1
有关这些设置的一些说明将对将来的读者有所帮助。
阿隆·罗特维

5

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

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


在这种情况下,基于块的快照并不是唯一好的。立即想到许多文件系统-WAFL和ZFS-也为快照删除提供了良好的性能。他们将快照视为一流的文件系统对象。因此,它们不必(缓慢地)遍历数百万个文件来确定要释放的块,而只需查看与快照关联的块列表。
基思·史密斯,2009年

嗯 我可能是因为上述观点太过矛盾。最初的发布者必须使用Linux,实际上并没有一个经过验证的Linux文件系统可以进行快照-尽管btrfs和nilfs在未来看起来很有趣。因此,实际上,我同意-更好地使用基于块的快照。
基思·史密斯

技巧+1可拆分和并行化工作负载:xfs在并行工作负载方面发挥了优势。
hurikhan77

5

不管使用什么文件系统,将ionice都用于IO密集型操作是很好的。
我建议这个命令:

ionice -n7不错rm -fr dir_name

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


2

我知道这已经很老了,但是我认为建议中使用id。您将顺序删除这些文件,执行并行rm操作可能会加快速度。

http://savannah.nongnu.org/projects/parallel/ parallel通常可以代替xargs使用

因此,如果您删除deltedir中的所有文件

find -t f deletedir | parallel -j 10 rm

这将使您只剩下空的目录结构即可删除。

注意:如上所述,您可能仍然会遇到文件系统限制。


使用并行而不是xargs有什么优势?
罗里

1

这里的另一种选择是分离数据,使您可以垃圾并重建实际的文件系统,而不用执行rm吗?


3
我认为rsnapshot使用硬链接作为高效维护多个快照功能的一部分。因此,如果发问者正在使用该功能,则无法使用单独的文件系统(因为您无法在文件系统边界上进行硬链接)
David Spillett

0

如何降低命令的优美性?喜欢:

nice -20 rm -rf /path/to/dir/

5
我要说的是,瓶颈不是调度程序,而是文件系统。
Manuel Faux

万一调度程序成为瓶颈,您最终只会加重I / O子系统的负担,从而使服务器在rm期间的可用性更低。
David Mackintosh,2009年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.