![删除旧文件很慢并且会“杀死”IO 性能](https://linux22.com/image/99355/%E5%88%A0%E9%99%A4%E6%97%A7%E6%96%87%E4%BB%B6%E5%BE%88%E6%85%A2%E5%B9%B6%E4%B8%94%E4%BC%9A%E2%80%9C%E6%9D%80%E6%AD%BB%E2%80%9DIO%20%E6%80%A7%E8%83%BD.png)
我正在使用 find 来修剪旧文件,其中有很多......这需要几分钟/几小时才能运行,并且其他服务器进程会遇到 IO 性能问题。
find -mtime +100 -delete -print
我尝试了 ionice 但它似乎没有帮助。
ionice -c 3
我们可以做些什么来 1. 加快查找操作并 2. 避免影响其他进程? FS 是 ext4.. ext4 不适合这种工作负载吗?内核是 3.16 存储是 RAID 1 中的 2 个 1TB 7200rpm HDD。现在 610228 个文件中有 93GB,因此平均 152KB/文件。
也许我不应该在一个目录中存储这么多文件?
答案1
当您像发布的那样运行find
命令时,它将rm
对其找到的每个文件执行 a 操作。就性能而言,这不是一个好方法。
为了改进此任务,您可以使用-exec
find 中的选项来处理命令的输出rm
:
find -mtime +100 -exec rm {} +
使用终止+
而不是替代非常重要\;
。使用 时+
,find 只会rm
针对简单执行时可以处理的最大文件数发出命令。终止后\;
,将为每个文件find
执行一个rm
命令,因此您会遇到同样的问题。
为了获得更好的性能,您可以将其加入到ionice
您提到的命令中。如果您没有注意到它提高了系统性能,最有可能的是它消耗的其他资源多于 I/O,例如 CPU。为此,您可以使用renice
命令降低进程的 CPU 使用优先级。
我会使用以下内容:
ionice -c 3 find -mtime +100 -exec rm {} +
现在,在另一个 shell 中,您需要找到 find 命令的 PID:ps -ef | grep find
最后运行 renice 命令:renice +19 -p <PID_find_command>