“du”程序可以变得不那么激进吗?

“du”程序可以变得不那么激进吗?

我们的常规工作是du对许多子目录进行摘要,找出最严重的违规者,并使用输出来查找是否有快速上升的内容以发现潜在的问题。我们使用diff快照来比较它们。

有一个顶级目录,带有多个(几百个)子目录,每个子目录可能包含数十个或数千个文件(或更多)。

在这种情况下,“ du -s”可能会造成非常严重的 IO 攻击,导致我们的服务器放弃其缓存,然后导致大量 IO 峰值,这是一种非常不受欢迎的副作用。

可以使用什么策略来获取相同的数据,而不产生不需要的副作用?

答案1

看一眼ionice。从man ionice:

该程序设置或获取程序的 io 调度类别和优先级。如果没有给出参数或仅给出 -p,ionice 将查询该进程的当前 io 调度类和优先级。

要使用“空闲”I/O 类(可用的最低优先级)运行du,您可以执行以下操作:

ionice -c 3 du -s

这应该会阻止du干扰其他进程的 I/O。您可能还需要考虑重新调整程序以降低其 CPU 优先级,如下所示:

renice -n 19 "$duPid"

您也可以在初始化时执行这两项操作:

nice -n 19 ionice -c 3 du

答案2

如果单个目录中有大量文件,这可能会导致 I/O 峰值,因为许多文件系统不能很好地处理单个目录中的大型文件树。将其拆分为更多子目录可能会有所帮助。如果单个目录中有超过 10k 个文件并且这会导致问题,那么您可能应该将其拆分。

至于跟踪磁盘使用情况,您可以首先查看df,如果那里的使用值没有快速上升,那么子目录也没有迅速上升,您可以du完全跳过。

另一种选择可能是磁盘配额系统,如果您的文件系统支持的话,它可以持续跟踪使用情况。

答案3

另外ionice你可以尝试让磁盘访问更有效率。这可以通过执行来尝试

find /du/root -printf ""
find /du/root -perm 777 -printf ""

首先(也许ionice也通过)。如果文件太多则不起作用。多少算太多取决于可用 RAM 的大小。

相关内容