我有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]