如何在ext3 / linux上使`rm`更快?

我有ext3文件系统挂载默认选项。 我有一些〜100GB的文件。

删除任何这样的文件需要很长时间(8分钟),并导致大量的IOstream量,这增加了服务器上的负载。

有什么方法可以使公司不具有破坏性?

最有意思的答案最初被埋在对这个问题的评论中。 这是作为一stream的答案,使其更加可见:

基本上没有任何方法从这里工作,所以我们开发自己的。 描述在这里: http ://www.depesz.com/index.php/2010/04/04/how-to-remove-backups/评论时间70年01月01日原作者:depesz

这个链接是对探索和发现可行解决scheme的非常透彻的分析。

还要注意:

文章说:

正如你所看到的,我用-c2 -n7选项-c2 -n7 ,这似乎是理智的。

这是真的,但用户TafT说,如果你不想中断,那么-c3 '空闲'将是一个更好的select,而不是'最好的'。 他用-c3在后台build立,并发现它运行良好,而不会导致构build等待。 如果你真的有100%的io使用,那么-c3不会让删除任何时候完成,但他不认为这是你的基础上工作的testing。

升级到ext4或其他使用扩展的现代文件系统。 由于ext3使用间接块scheme而不是扩展块,删除大文件不可避免地需要大量的工作。

你可以尝试一下ionice 。 它不会让速度更快,但可能会使它不那么具有破坏性。

就效率而言,每个文件使用一个rm并不是最优的,因为它需要每个rm的fork和exec。

假设你有一个list.txt包含你想要删除的文件会更有效,但是它仍然会变得很慢:

 xargs -i rm {} < list.txt 

另一种方法是: nice -20 xargs -i rm {} < list.txt
(这将花费更less的时间,但会极大地影响你的系统:)

要么

我不知道这将是多快,但是:

 mv <file-name> /dev/null 

要么

使用快速文件系统(使用循环设备?)创build一个特殊的安装点,使用它来存储和删除您的巨大文件。
(可能会在删除文件之前将其移动到文件中,也许这样会更快,也可能只是在想要删除文件时才卸载文件)

要么

cat /dev/null > /file/to/be/deleted (所以它现在是零大小),如果你想它现在消失rm -rf <file>现在

甚至更好

放下猫,然后执行# > /file/to/be/emptied

我有问题让目录以合理的速度删除,事实certificate,这个过程locking了磁盘,并创build了一堆尝试访问磁盘的进程。 ionice没有工作,它只是继续使用99%的磁盘IO,并locking所有其他进程。

这是为我工作的Python代码。 它一次删除500个文件,然后花2秒时间让其他进程完成工作,然后继续。 很好用。

 import os, os.path import time for root, dirs, files in os.walk('/dir/to/delete/files'): file_num = 0 for f in files: fullpath = os.path.join(root, f) os.remove(fullpath) if file_num%500 == 1: time.sleep(2) print "Deleted %i files" % file_num file_num = file_num + 1 

我的两分钱

我已经有这个问题了。 “在需要快速运行的顺序脚本中,进程会删除大量文件”。因此,“rm”会使脚本的速度接近IO等待/执行时间。

所以为了使事情更快,我已经添加了另一个进程(bash脚本)启动每个cron ..就像一个垃圾收集器,它删除特定目录中的所有文件。

然后,我通过将mvreplace为“rm”到“垃圾文件夹”来更新原始脚本(通过在名称末尾添加计数器来重命名文件以避免碰撞)。

这对我来说,脚本运行速度至less快3倍。 但只有当垃圾文件夹和原始文件在同一挂载点(相同的设备)下才能正常工作,以避免文件复制。 (同一设备上的mv比rm消耗更less的IO)

希望帮助..

还要注意,Dennis Williamson的答案是,只有当您的块设备使用CFQ io调度程序时,才会将ionice作为负载的解决方法。

你可以尝试创build一个循环文件​​系统来存储你的备份。

 # dd if=/dev/zero of=/path/to/virtualfs bs=100M count=1024 # 100 MB * 1024 = 100 GB # mke2fs /path/to/virtualfs # mount -t ext2 /path/to/virtualfs /mnt/backups -o loop 

然后,当你想清除备份:

 # umount /mnt/backups # mke2fs /path/to/virtualfs # mount -t ext2 /path/to/virtualfs /mnt/backups -o loop 

普雷斯托! 整个虚拟文件系统在一瞬间就被清除了。

您可以使用多重连接的xargs

 find . -type f | xargs -P 30 rm -rf 

其中30是您要创build的线程数。 如果您使用的是零,则系统会为执行该任务的用户创build最大的线程数。

mv <文件名> / dev / null

/ dev / null是一个不是目录的文件。 无法将文件移动到文件,或者您可能会覆盖文件。

使用快速文件系统(使用循环设备?)创build一个特殊的安装点,使用它来存储和删除您的巨大文件。 (可能会在删除文件之前将其移动到文件中,也许这样会更快,也可能只是在想要删除文件时才卸载文件)

我不认为这是实际的。 它会使用不必要的更多的I / O比OP想要的。

/ dev / null是一个不是目录的文件。 无法将文件移动到文件,或者您可能会覆盖文件。

实际上这是一个设备,写入到它的所有数据都被丢弃,所以mv <file> /dev/null是有意义的

维基百科,自由的百科全书
在类Unix操作系统中,/ dev / null或null设备是丢弃所有写入数据的特殊文件(但报告写入操作成功),并且不向任何从其读取的进程提供数据(产生EOF立即)。[1]