如何缓存或以其他方式加速“du”摘要?

Ian*_*non 44 filesystems cache disk-usage

我们有一个大型文件系统,其中完整的du(磁盘使用情况)摘要需要两分钟以上。我想找到一种方法来加速该文件系统上任意目录的磁盘使用情况摘要。

对于小分支,我注意到du结果似乎以某种方式缓存,因为重复请求要快得多,但在大分支上,速度的提高可以忽略不计。

是否有一种简单的方法可以加速du或更积极地缓存自上次搜索以来尚未修改的分支的结果?

或者是否有其他命令可以更快地提供磁盘使用情况摘要?

Bil*_*hor 26

当您重新运行 du 命令时,您看到的是磁盘缓冲的效果。一旦你读取了一个块,它的磁盘缓冲区就会保存在缓冲区缓存中,直到需要该块为止。对于 du,您需要读取目录中每个文件的目录和 inode。在这种情况下,du 结果不会被缓存,但可以用更少的磁盘 IO 来导出。

虽然可以强制系统缓存此信息,但由于所需的缓冲区空间无法用于主动访问的文件,因此整体性能会受到影响。

目录本身不知道文件有多大,因此需要访问每个文件的 inode。为了在每次文件更改大小时使缓存值保持最新,需要更新缓存值。由于文件可以在 0 个或多个目录中列出,这将要求每个文件的 inode 知道它在哪些目录中列出。这会极大地使 inode 结构复杂化并降低 IO 性能。此外,由于 du 允许您获得假设不同块大小的结果,因此缓存中所需的数据需要针对每个可能的块大小递增或递减缓存值,从而进一步降低性能。


小智 16

du通过使用可以极大地加快 的常见用法ncdu

ncdu - NCurses Disk Usage

执行du, 缓存结果并在一个漂亮的命令行 gui 中显示它们, 有点类似于du -hc -d 1 | sort -h. 初始索引所需的时间与 一样长du,但寻找填满宝贵空间的实际“罪魁祸首”的速度会加快,因为所有子目录都有最初缓存的 du 信息可用。

如果需要,可以按 [r] 刷新子目录,按 [d] 可以删除文件/文件夹,这两者都会更新所有父目录的统计信息。删除要求确认。

如果需要,可以通过ncdu -1xo- / | gzip >export.gz在 cronjob 中预缓存并稍后使用 访问它来进一步加速zcat export.gz | ncdu -f-,但显然会提供更多过时的信息。


小智 13

duc
Run Code Online (Sandbox Code Playgroud)

(请参阅https://duc.zevv.nl)可能是您正在寻找的。

Duc 将磁盘使用情况存储在优化的数据库中,从而产生快速的用户界面。索引完成后没有等待时间。

更新索引对我来说非常快(对于 121k 目录中的大约 950k 个文件,2.8 TB 不到 10 秒)。有一个 GUI 和一个 ncurses UI。

用法例如:

duc index /usr
duc ui /usr
Run Code Online (Sandbox Code Playgroud)

从网站:

Duc 旨在扩展到庞大的文件系统:它可以毫无问题地索引和显示 PB 存储中的数亿个文件。


SHW*_*SHW 9

我更喜欢用ageu

Agedu 是一款软件,它试图在这些文件很可能不需要的情况下找到旧的和不规则使用的文件。(例如,只浏览过一次的下载。)

它执行的磁盘扫描基本上与 相同du,但它还记录了它扫描的所有内容的最后访问时间。然后它构建一个索引,让它有效地生成报告,给出每个子目录的结果摘要,然后根据需要生成这些报告。

  • 不回答问题,但仍然+1。不错的提示。 (4认同)

Gil*_*il' 7

如果可以安排不同层次的文件属于不同的组,则可以设置磁盘配额。除非您想要上限,否则不要给出上限(或使其成为磁盘的大小)。您仍然可以立即知道该组使用了多少(实际上是无限的)配额。

这确实需要您的文件系统支持每组配额。Linux 的 Ext[234] 和 Solaris/*BSD/Linux 的 zfs 可以。如果组配额将 ACL 考虑在内,这对您的用例会很好,但我认为它们不会。


Yuv*_*val 5

正如 SHW 所提到的,agedu确实创建了一个索引。在阅读了有关locatedb. 您可以locatedbdu输出创建自己的 a 版本:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb
Run Code Online (Sandbox Code Playgroud)

awk重新排列 du 输出以首先具有文件名,以便frcode正常工作。然后使用locate这个数据库来快速报告磁盘使用情况:

locate --database=du.locatedb pingus
Run Code Online (Sandbox Code Playgroud)

您可以扩展它以满足您的需求。我认为这是对locationb 的一个很好的使用。