如何让 `rm` 在 ext3/linux 上运行得更快?

如何让 `rm` 在 ext3/linux 上运行得更快?

我使用默认选项安装了 ext3 文件系统。上面有一些大约 100GB 的文件。

删除任何此类文件都需要很长时间(8分钟)并导致大量 io 流量,从而增加服务器的负载。

有什么办法可以让公司不那么混乱吗?

答案1

最有趣的答案最初隐藏在对这个问题的评论中。下面是一流的答案,以使其更加明显:

基本上这里的方法都不起作用,所以我们开发了自己的方法。描述如下: http://www.depesz.com/index.php/2010/04/04/how-to-remove-backups/— depesz 2010 年 4 月 6 日 15:15

该链接对可行解决方案的探索和发现进行了极其彻底的分析。

另请注意:

文章说:

正如您所看到的,我使用了-c2 -n7ionice 选项,这看起来很合理。

确实如此,但用户 TafT 表示,如果您不想中断,那么-c3“空闲”将是比-c2“尽力而为”更好的选择。他曾经-c3在后台构建,发现它运行良好,不会导致构建永远等待。如果您确实有 100% 的 io 使用率,那么-c3将不会让删除永远完成,但他并不认为这是基于工作测试的结果。

答案2

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

答案3

你可以给予伊奥尼采试试吧。虽然它不会加快速度,但可能会减少破坏性。

答案4

我在以合理的速度删除目录时遇到了问题,结果发现该过程锁定了磁盘并创建了试图访问磁盘的进程堆积。ionice 不起作用,它只是继续使用 99% 的磁盘 IO 并锁定了所有其他进程。

这是对我有用的 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

相关内容