删除旧文件很慢并且会“杀死”IO 性能

删除旧文件很慢并且会“杀死”IO 性能

我正在使用 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 操作。就性能而言,这不是一个好方法。

为了改进此任务,您可以使用-execfind 中的选项来处理命令的输出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>

相关内容