【问题标题】:How to gather disk usage on a storage system faster than just using "du"? [closed]如何比仅使用“du”更快地收集存储系统上的磁盘使用情况? [关闭]
【发布时间】:2026-01-23 05:05:02
【问题描述】:

我使用 Synology NAS 设备,该设备包含 600 多个用户数据。

用户备份数据为税务会计数据。 因此,大约一个用户的文件夹有 200,000 个文件。

我必须向每个用户提供他们的备份数据使用信息,但是由于目录和文件太多,du 命令执行时间太长。

有人可以提供一种方法来更快地检查每个用户的磁盘使用情况吗?

【问题讨论】:

    标签: linux storage capacity synology du


    【解决方案1】:

    没有魔法。为了收集磁盘使用情况,您必须遍历文件系统。如果您正在寻找一种仅在文件系统级别执行此操作的方法,那将很容易(例如 df -h)...但听起来您希望它位于挂载点内的目录级别。

    您也许可以在每个目录上并行运行作业。例如在 bash 中:

    for D in `ls -d */`
    do
        du -s $D &
    done
    
    wait
    

    但我认为,您可能会受到 i/o 限制。此外,如果您有很多*目录,那么这种方法可能......嗯......相当费力,因为它没有任何类型的最大进程数控制。

    如果您安装了GNU Parallel,您可以执行以下操作:

    ls -d */ | parallel du -s 
    

    ...这样会好很多。 parallel 有很多不错的功能,比如对输出进行分组、管理最大进程等……你也可以传入一些参数来调整它(尽管,就像我之前提到的,你会成为 i/o绑定,所以更多的进程并不是更好,实际上少于默认值可能更可取)。

    我对此的唯一其他想法可能是使用disk quotas,如果这真的是你想要做的事情的话。如果你想了解它,有一个很好的教程here

    【讨论】:

    • 如果数据存储在旋转介质上,并行运行多个请求是您可以为性能做的最糟糕的事情之一。搜索很慢,同时请求会导致大量额外的搜索。
    • 是的,取决于你的情况。我有一个集群的 NAS 我读过,当你在这种情况下有很多文件要读取时,并行实际上确实有很大帮助。像任何事情一样,您不应该盲目地实施它。测试一下,看看它是否真的有用,然后再投入生产使用。
    • 人们会认为要获得文件系统子树(不包括链接)的总使用量,需要维护和有效访问某种摘要信息。这类似于在分区级别发生的情况:df 立即返回可用空间。在分区级别可能更容易实现,因为它只是维护已用块的数量。在文件系统级别,这也是可行的,但取决于实现。也许出于性能原因,它被排除在常见的文件系统实现之外?
    最近更新 更多