user13185 Asked: 2010-04-01 01:24:19 +0800 CST2010-04-01 01:24:19 +0800 CST 2010-04-01 01:24:19 +0800 CST 如何让 `rm` 在 ext3/linux 上更快? 772 我使用默认选项安装了 ext3 文件系统。在它上面我有一些 ~ 100GB 的文件。 删除任何此类文件需要很长时间(8 分钟)并导致大量 io 流量,从而增加服务器的负载。 有没有办法让 rm 不那么具有破坏性? performance linux ext3 rm unlink 11 个回答 Voted janneb 2010-04-01T02:57:46+08:002010-04-01T02:57:46+08:00 升级到 ext4 或其他一些使用范围的现代文件系统。由于 ext3 使用间接块方案而不是扩展区,因此删除大文件不可避免地需要大量工作。 Best Answer Matt McClure 2012-01-04T19:33:41+08:002012-01-04T19:33:41+08:00 最有趣的答案最初埋在对该问题的评论中。这是使其更加明显的一流答案: 基本上这里没有任何方法有效,所以我们开发了自己的方法。在这里对其进行了描述: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将不会让删除完成,但他不希望这是您基于工作测试所拥有的。 Dennis Williamson 2010-04-01T01:46:07+08:002010-04-01T01:46:07+08:00 你可以试试ionice 。它不会让它更快,但它可能会减少它的破坏性。 user126330 2010-04-01T01:36:25+08:002010-04-01T01:36:25+08:00 就效率而言,每个文件使用一个 rm 并不是最优的,因为它需要为每个 rm 一个 fork 和 exec。 假设您有一个 list.txt 包含要删除的文件,这会更有效率,但它仍然会很慢: xargs -i rm {} < list.txt 另一种方法是:( nice -20 xargs -i rm {} < list.txt 这将花费更少的时间,但会极大地影响您的系统:) 或者 我不知道这会有多快,但是: mv <file-name> /dev/null 或者 使用快速文件系统创建一个特殊的挂载点(使用循环设备?),用它来存储和删除你的巨大文件。 (也许在删除文件之前将文件移到那里,也许它更快,或者当你想要文件消失时卸载它) 或者 cat /dev/null > /file/to/be/deleted(所以它现在是零大小)如果你想让它rm -rf <file>现在消失 甚至更好 放下猫,然后做# > /file/to/be/emptied Nick Woodhams 2012-12-24T07:50:21+08:002012-12-24T07:50:21+08:00 我在以合理的速度删除目录时遇到问题,结果发现该进程正在锁定磁盘并创建一堆试图访问磁盘的进程。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 Emmanuel Devaux 2015-01-31T01:51:53+08:002015-01-31T01:51:53+08:00 我的两分钱。 我已经有这个问题了。“在必须快速运行的顺序脚本中,该过程确实删除了很多文件” .. 所以“rm”将使该脚本速度接近 IO 等待/执行时间。 所以为了让事情变得更快,我添加了另一个进程(bash 脚本),每个 cron 启动......就像垃圾收集器一样,它会删除特定目录中的所有文件。 然后我通过将“rm”替换为“垃圾文件夹”来更新原始脚本(通过在其名称末尾添加一个计数器来重命名文件以避免冲突)。 这对我有用,脚本运行速度至少快 3 倍。但只有当垃圾文件夹和原始文件在同一挂载点(同一设备)下才能正常工作以避免文件复制。(同一设备上的 mv 消耗的 IO 比 rm 少) 希望有帮助.. famzah 2010-04-01T07:10:57+08:002010-04-01T07:10:57+08:00 另请注意,建议将ionice作为负载的解决方法的 Dennis Williamson 的回答仅在您的块设备使用 CFQ io 调度程序时才有效。 Felipe Alvarez 2010-05-22T02:22:39+08:002010-05-22T02:22:39+08:00 mv <文件名> /dev/null /dev/null 是文件而不是目录。无法将文件移动到文件中,否则可能会覆盖它。 使用快速文件系统创建一个特殊的挂载点(使用循环设备?),用它来存储和删除你的巨大文件。(也许在删除文件之前将文件移到那里,也许它更快,或者当你想要文件消失时卸载它) 我不认为这是实用的。它将不必要地使用比 OP 想要的更多的 I/O。 amphetamachine 2011-02-22T17:40:11+08:002011-02-22T17:40:11+08:00 您可以尝试创建一个循环文件系统来存储您的备份。 # 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 快!整个虚拟文件系统很快就会被清除。 Juan Carlos 2012-03-13T01:57:24+08:002012-03-13T01:57:24+08:00 您可以使用 xargs 的多标题 find . -type f | xargs -P 30 rm -rf 其中 30 是您要创建的线程数。如果您使用零,系统会为执行任务的用户创建最大可用线程。
升级到 ext4 或其他一些使用范围的现代文件系统。由于 ext3 使用间接块方案而不是扩展区,因此删除大文件不可避免地需要大量工作。
最有趣的答案最初埋在对该问题的评论中。这是使其更加明显的一流答案:
该链接是对探索和发现可行解决方案的令人难以置信的彻底分析。
另请注意:
文章说:
这是真的,但用户 TafT 说,如果您不希望受到干扰,那么
-c3
“空闲”将是比-c2
“尽力而为”更好的选择。他过去常常-c3
在后台构建,并且发现它运行良好,不会导致构建永远等待。如果您确实有 100% 的 io 使用率,那么-c3
将不会让删除完成,但他不希望这是您基于工作测试所拥有的。你可以试试ionice 。它不会让它更快,但它可能会减少它的破坏性。
就效率而言,每个文件使用一个 rm 并不是最优的,因为它需要为每个 rm 一个 fork 和 exec。
假设您有一个 list.txt 包含要删除的文件,这会更有效率,但它仍然会很慢:
另一种方法是:(
nice -20 xargs -i rm {} < list.txt
这将花费更少的时间,但会极大地影响您的系统:)
或者
我不知道这会有多快,但是:
或者
使用快速文件系统创建一个特殊的挂载点(使用循环设备?),用它来存储和删除你的巨大文件。
(也许在删除文件之前将文件移到那里,也许它更快,或者当你想要文件消失时卸载它)
或者
cat /dev/null > /file/to/be/deleted
(所以它现在是零大小)如果你想让它rm -rf <file>
现在消失甚至更好
放下猫,然后做
# > /file/to/be/emptied
我在以合理的速度删除目录时遇到问题,结果发现该进程正在锁定磁盘并创建一堆试图访问磁盘的进程。ionice 没有工作,它只是继续使用 99% 的磁盘 IO 并锁定所有其他进程。
这是对我有用的 Python 代码。它一次删除 500 个文件,然后休息 2 秒让其他进程完成工作,然后继续。效果很好。
我的两分钱。
我已经有这个问题了。“在必须快速运行的顺序脚本中,该过程确实删除了很多文件” .. 所以“rm”将使该脚本速度接近 IO 等待/执行时间。
所以为了让事情变得更快,我添加了另一个进程(bash 脚本),每个 cron 启动......就像垃圾收集器一样,它会删除特定目录中的所有文件。
然后我通过将“rm”替换为“垃圾文件夹”来更新原始脚本(通过在其名称末尾添加一个计数器来重命名文件以避免冲突)。
这对我有用,脚本运行速度至少快 3 倍。但只有当垃圾文件夹和原始文件在同一挂载点(同一设备)下才能正常工作以避免文件复制。(同一设备上的 mv 消耗的 IO 比 rm 少)
希望有帮助..
另请注意,建议将ionice作为负载的解决方法的 Dennis Williamson 的回答仅在您的块设备使用 CFQ io 调度程序时才有效。
/dev/null 是文件而不是目录。无法将文件移动到文件中,否则可能会覆盖它。
我不认为这是实用的。它将不必要地使用比 OP 想要的更多的 I/O。
您可以尝试创建一个循环文件系统来存储您的备份。
然后,当您要清除备份时:
快!整个虚拟文件系统很快就会被清除。
您可以使用 xargs 的多标题
其中 30 是您要创建的线程数。如果您使用零,系统会为执行任务的用户创建最大可用线程。