【发布时间】:2015-10-28 20:21:17
【问题描述】:
我目前通过 bash 脚本(在 Centos 6 上)每 30 分钟执行一次此命令,以删除大约 1 小时前的文件。问题是 find 命令一直使用我 45% 的 cpu .有没有办法优化它。任何时间点缓存中大约有200k个项目
find /dev/shm/cache -type f -mmin +59 -exec rm -f {} \;
【问题讨论】:
我目前通过 bash 脚本(在 Centos 6 上)每 30 分钟执行一次此命令,以删除大约 1 小时前的文件。问题是 find 命令一直使用我 45% 的 cpu .有没有办法优化它。任何时间点缓存中大约有200k个项目
find /dev/shm/cache -type f -mmin +59 -exec rm -f {} \;
【问题讨论】:
您可以尝试使用nice 以较低的优先级运行该进程:
nice -n 19 find ...
另一件事,它可能不会对性能产生影响,
但要删除与find 匹配的文件,
更简单的方法是-delete 而不是-exec:
find /dev/shm/cache -type f -mmin +59 -delete
...如果您的find 版本支持它(感谢@chepner 指出)(现代版本支持...)
【讨论】:
find 的实现都支持-delete,但如果可用,它非常好用。
您的命令正在为找到的每个文件开始新的rm 调用,这可能非常昂贵。您可以使用另一种语法,将多个参数发送到rm,在操作系统允许的范围内批量发送。这是通过以+ 而不是; 结束命令来完成的
find /dev/shm/cache -type f -mmin +59 -exec rm -f {} +
您也可以使用 -delete 选项,如 janos 的回答;它应该更有效,因为它根本不需要运行外部进程。我正在展示这个答案,因为它也可以推广到其他命令,这些命令可能没有等效选项,例如
-exec grep foo {} +
【讨论】: