我的目录充满了数百万个gif图像。rm命令太多。
我一直在尝试这样的find命令:
find . -name "*.gif" -print0 | xargs -0 rm
问题是,它使我的机器停顿得很不好,并且由于它是服务器,因此导致客户超时。
有什么方法可以更快地删除所有这些文件...而无需锁定机器?
rm -rf
会更快这是值得一试。
我的目录充满了数百万个gif图像。rm命令太多。
我一直在尝试这样的find命令:
find . -name "*.gif" -print0 | xargs -0 rm
问题是,它使我的机器停顿得很不好,并且由于它是服务器,因此导致客户超时。
有什么方法可以更快地删除所有这些文件...而无需锁定机器?
rm -rf
会更快这是值得一试。
Answers:
更快不一定是您想要的。您实际上可能希望运行慢一些,因此删除在运行时会占用较少的资源。
使用nice(1)降低命令的优先级。
nice find . -name "*.gif" -delete
对于受I / O约束的进程,nice(1)可能还不够。Linux调度程序确实考虑了I / O,而不仅仅是CPU,但您可能希望更好地控制I / O优先级。
ionice -c 2 -n 7 find . -name "*.gif" -delete
如果这样做没有效果,您还可以添加睡眠以真正减慢它的速度。
find . -name "*.gif" -exec sleep 0.01 \; -delete
sleep
添加项-尽管使用,但我在IO上阻塞服务器时遇到了麻烦ionice -c 3
。它确实大大增加了清除文件所需的时间(当然),但是我宁愿等待而不是关闭应用程序……
由于您正在运行Linux,并且此任务可能受I / O限制,因此建议您使用以下命令为您的命令空闲I / O调度程序赋予优先级ionice(1)
:
ionice -c3 find . -name '*.gif' -delete
与您的原始命令相比,我认为通过避免使用管道连接甚至可以节省更多的CPU周期xargs
。
ionice -c3
降低IO,使其在IO空闲时仅运行即可,因此非常理想。请注意,由于-delete
这不是标准的查找方法,因此您可以使用以下命令执行相同的操作(包括有效的反馈):ionice -c 3 find . -name '*.gif' -exec echo {} \; -exec rm {} \;
-缓慢但没有重要过程的等待。
没有比磁盘软格式更快捷的方法了。这些文件提供给RM 一次(最多到命令行的限制,它可以也设置为xargs
),这是为每个文件调用RM好得多。所以不,绝对没有更快的方法。
使用nice
(或renice
在正在运行的进程上)只能部分帮助,因为那是为了调度CPU资源,而不是磁盘!而且CPU使用率将非常低。这是linux的一个弱点-如果一个进程“吞噬”了磁盘(即可以很好地使用磁盘),则整个计算机都将卡住。修改后的内核以供实时使用可能是一个解决方案。
我在服务器上要做的是手动让其他进程执行其工作-包括暂停以使服务器保持“呼吸”状态:
find . -name "*.gif" > files
split -l 100 files files.
for F in files.* do
cat $F | xargs rm
sleep 5
done
每100个文件后将等待5秒。这将花费更长的时间,但是您的客户不会注意到任何延迟。
如果要删除的文件数量大大超过了遗留的文件数量,那么走遍待删除文件树并进行所有这些文件系统更新可能不是最有效的方法。(这类似于执行笨拙的引用计数的内存管理,访问大树中的每个对象以删除其引用,而不是一步将所有不需要的内容放入垃圾中,然后遍历所有可清除的内容。)
也就是说,克隆要保留到另一卷的树的部分。在原始卷上重新创建一个全新的空白文件系统。将保留的文件复制回其原始路径。这模糊地类似于复制垃圾回收。
会有一些停机时间,但是比持续的性能下降和服务中断更好。
在您的系统和情况下,这可能不切实际,但是很容易想到这是可行的明显情况。
例如,假设您要删除文件系统中的所有文件。逐个递归和删除的目的是什么?只需卸载它,然后在分区上方执行“ mkfs”,即可创建空白文件系统。
还是假设您想删除除六个重要文件以外的所有文件?从那里拿出六打,然后在上面放上“ mkfs”。
最终,当必须保留足够的文件时,会有一个收支平衡点,考虑到其他成本(如停机时间),进行递归删除会变得更便宜。