我在这里得到了许多有用的答案/评论,在此我也想总结一下,并展示我的解决方案。
是的,防止此类情况发生的最佳方法是将缓存目录保留在单独的文件系统上。核对/快速格式化文件系统最多最多需要几秒钟(也许是几分钟),这与文件系统上存在多少文件/目录无关。
该ionice
/ nice
解决方案没有做任何事情,因为删除过程实际上造成几乎没有I / O。导致I / O的原因是,我相信当删除过程过快地删除文件时,内核/文件系统级队列/缓冲区会填满。
我解决该问题的方法与Tero Kilkanen的解决方案相似,但是不需要调用shell脚本。我使用rsync的内置--bwlimit
开关来限制删除速度。
完整的命令是:
mkdir empty_dir
rsync -v -a --delete --bwlimit=1 empty_dir/ cache.bak/
现在,bwlimit以千字节为单位指定带宽,在这种情况下,带宽适用于文件名或文件路径。通过将其设置为1 KBps,它每小时删除约100,000个文件,或每秒删除27个文件。文件具有相对路径,例如cache.bak/e/c1/db98339573acc5c76bdac4a601f9ec1e
,长度为47个字符,因此它每秒可以提供1000/47〜= 21个文件,因此有点类似于我每小时估计有100,000个文件。
现在为什么--bwlimit=1
呢?我尝试了各种值:
- 10000、1000、100->系统变慢
- 10->系统在一段时间内运行良好,但每分钟左右会产生部分速度下降。HTTP响应时间仍小于1秒。
- 1->完全没有系统速度下降。我并不着急,因此可以在不到1天的时间内删除200万个文件,所以我选择了它。
我喜欢rsync内置方法的简单性,但是此解决方案取决于相对路径的长度。这不是一个大问题,因为大多数人会通过反复试验找到正确的价值。