如何防止子树删除(`rm -rf`)使磁盘I / O的其他进程饿死?


8

对于繁忙的站点,我们有一个非常大的(多个GB)Nginx缓存目录,有时我们需要一次将其全部清除。过去,我已通过以下方法解决了该问题:将缓存文件夹移至新路径,在旧路径下创建一个新的缓存文件夹,然后rm -rf打开旧的缓存文件夹。

但是,近来,当我需要在一个繁忙的早晨清除缓存时rm -rf,由于Nginx及其所面向的服务器都是读取密集型的,因此I / O 使服务器的磁盘访问进程陷入饥饿。我可以观察到CPU闲置时的平均负载攀升,并rm -rf占用了98-99%的磁盘IO iotop

ionice -c 3调用时rm,我已经尝试过了,但是它对观察到的行为似乎没有明显的影响。

有什么方法可以驯服rm -rf更多共享磁盘?我是否需要使用其他技术来借鉴ionice

更新:

有问题的文件系统是一个AWS EC2实例存储(主磁盘是EBS)。该/etc/fstab条目如下所示:

/dev/xvdb       /mnt    auto    defaults,nobootwait,comment=cloudconfig 0       2

您可能还应该提及正在使用的文件系统以及如何使用(挂载选项)。
Cristian Ciupitu

更新。另外,万一有问题,请在Ubuntu 12.04上使用。
大卫·艾克

请注意,Amazon EBS上的IO性能可能很差。请参阅perfcap.blogspot.com/2011/03/…,该建议值建议长期最大为100 iops,短期(1分钟)突发最多为1000 iops。听起来您的情况比一分钟内要高得多,因此出现了问题。
Moshe Katz

正确,这就是为什么我们将实例存储而不是EBS用于缓存。看到我的更新评论。很抱歉,如果不清楚。
大卫·艾克

抱歉,我来晚了,但是您可以研究cgroup和blkio控制器:kernel.org/doc/Documentation/cgroups/blkio-controller.txt
AndreasM 2013年

Answers:


3

从此页面收集的所有数据。 以下是删除大型目录文件的一些选项。请查看文章以详细了解其产生方式。

命令经过的系统时间%CPU cs1 *(Vol / Invol)
rsync -a –删除空/ a 10.60 1.31 95%106/22
查找b /-类型f-删除28.51 14.46 52%14849/11
查找c / -type f | xargs -L 100 rm 41.69 20.60 54%37048/15074
找到d / -type f | xargs -L 100 -P 100 rm 34.32 27.82 89%929897/21720
rm -rf f 31.29 14.80 47%15134/11

* cs1是自愿和非自愿的上下文切换


虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。
汤姆·奥康纳

迷人!我会试试看。
大卫·艾克

rsync正在运行。也许现在说还为时过早,并且我可以在一个忙碌的早晨不运行它,但服务器仍然可以响应并且平均负载是可管理的,这可能会有所帮助。
大卫·埃克

我正在使用的确切调用:ionice -c 3 nice -19 rsync -a --delete /mnt/empty/ /mnt/nginx-cache-old
David Eyk

好吧,只用了4个小时。;)我将接受这个答案(对不起@aferber),因为我喜欢简单的调用,并且它似乎容易受到nice和的影响ionice,或者至少它并没有像破坏服务器那样rm -rf
大卫·艾克

9

删除文件仅在文件系统上执行元数据操作,不受ionice的影响。

最简单的方法是,如果您现在不需要磁盘空间,则rm在非高峰时间执行。

MIGHT工作的更复杂的方法是随着时间的推移分散删除内容。您可以尝试以下操作(请注意,它假定您的路径和文件名不包含空格!):

while find dir -type f | head -n 100 | xargs rm; do sleep 2; done
while find dir -type d -depth | head -n 100 | xargs rmdir; do sleep 2; done

还要注意,您不能rm -f在第一个命令中使用,因为这样循环不会停止(取决于循环的错误退出代码)rm没有参数时)。

您可以通过修改每个周期的删除次数(示例中为100)和睡眠持续时间来进行调整。但是,由于文件系统可能仍会束缚元数据更新,而这可能会给您的IO负载带来麻烦,因此它可能实际上并不起作用。您只需要尝试。


删除那么多文件需要花费很长时间,因此,实际上没有任何“非高峰期”可以解决这个问题。:(
大卫·艾克

当时,while循环似乎可以解决问题head -n 50。100仍在缓慢将平均负载提高到临界以上,这表明正在进行太多的资源争用。
大卫·艾克

伙计,这需要很长时间才能运行!
大卫·艾克

对于while循环的每次迭代,查找仍将列出目录中的所有文件和所有子目录。您可能会用类似的方法做得更好
Randy Orrison

1
对于while循环的每次迭代,查找仍将列出目录中的所有文件和所有子目录。您可能可以使用find dir -type f -print0 | xargs -l50 -0 rmwait其中rmwait是执行rm“ $ @”的脚本;睡眠2.请注意使用-print0和-0处理带空格的文件名。-l50告诉xargs一次只能执行50次。
兰迪·奥里森

-1

您可以将其与“ nice”命令配对。 ionice -c 3 nice -19 rm -rf /some/folder

这将更改计算机上进程的优先级。


不幸的是,nice似乎效果与差不多一样ionice,也就是说,没有什么可察觉的。
大卫·埃克

@DavidEyk。如果nice和ionice没有“显着”的效果,则意味着没有其他任何东西以任何明显的方式争夺资源,或者您根本没有用肉眼注意到这种效果。您确实应该使用iostat和vmstat对其进行基准测试,以查看实际效果。
Michael Martinez

我相信@aferber在他的回答中解决了这个问题:“删除文件仅在文件系统上执行元数据操作,而不受ionice的影响。” 我已经看到了争用-我的服务器进程在CPU瘫痪并且rm -rf打开99%的时间时饿死了阅读时间iotop
大卫·埃克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.