我使用默认选项安装了 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 -n7
ionice 选项,这看起来很合理。
确实如此,但用户 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