我们的常规工作是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 的大小。