如何缓存或以其他方式加快`du`摘要?


33

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

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

有没有一种简单的加速方法du,或者更主动地缓存自上次搜索以来未修改过的分支的结果?

还是有一个替代命令可以更快地提供磁盘使用情况摘要?


8
两分钟对我来说似乎并不长。但真正的问题是:“您是否真的希望du缓存任何内容?” du不应为您提供尽可能准确的,实际的实际磁盘块计数吗?
Bruce Ediger

我同意替换du将是不好的,但是具有相同接口的更快的包装器脚本对我们非常有用。此外,我希望缓存结果取决于上次修改的时间(并假设没有磁盘范围的操作(例如,碎片整理))会给出确切的大小结果:我遗漏了什么吗?
伊恩·麦金农

2
如果您担心磁盘使用过多,则可以考虑实施配额。
pyasi 2011年

2
布鲁斯-您可能会问同样的问题find。但接着有locate
2013年

如果您使用的是Android,请查看StatFs有关目录大小的超快速估计。与相比,大型复杂目录的速度提高了近1000倍du
约书亚·品特

Answers:


21

重新运行du命令时看到的是磁盘缓冲的效果。读取一个块后,其磁盘缓冲区将保留在缓冲区高速缓存中,直到需要该块为止。对于du,您需要读取目录和目录中每个文件的索引节点。在这种情况下,不会缓存du结果,但是可以使用更少的磁盘IO得出结果。

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

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


7

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

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


7

使用du可以大大加快的常用用法ncdu

ncdu - NCurses Disk Usage

执行du,缓存结果并以漂亮的命令行gui(与相当)显示它们du -hc -d 1 | sort -h。初始索引花费的时间与相同du,但是由于所有子目录都有可用的初始缓存du信息,因此寻找填充宝贵空间的实际“罪魁祸首”的速度加快了。

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

如果需要的话,可以通过预先缓存ncdu -1xo- / | gzip >export.gzcronjob并稍后使用来实现进一步的加速zcat export.gz | ncdu -f-,但是显然提供了更多过时的信息。


7

我更喜欢使用agedu

Agedu是一款软件,它以最有可能不需要这些文件为前提,尝试查找旧文件和不定期使用的文件。(例如,仅被查看一次的下载。)

它执行与磁盘扫描基本上相同的磁盘扫描du,但是它还记录其扫描的所有内容的最后访问时间。然后,它建立一个索引,使其可以有效地生成报告,以提供每个子目录的结果摘要,然后按需生成这些报告。


4
无法回答问题,但仍然+1。不错的提示。
0xC0000022L

我已经对问题进行了编辑,以使其更清楚地表明它确实回答了问题(agedu索引了磁盘的使用以及访问时间)。
安东尼·G-莫妮卡的大法官

5

正如SHW提到的,agedu确实创建了一个索引。在阅读了以后,我想我会分享另一种创建索引的方法locatedb。您可以locatedb通过du输出创建自己的版本:

du | awk '{print $2,$1}' | /usr/lib/locate/frcode > du.locatedb

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

locate --database=du.locatedb pingus

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


3
duc

(看到 https://duc.zevv.nl)可能就是您想要的。

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

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

用法,例如:

duc index /usr
duc ui /usr

从网站:

Duc是为扩展到大型文件系统而构建的:它将在PB级存储中建立索引并显示数亿个文件,而不会出现问题。


2

我有一个cronjob设置为每10分钟运行一次updateb。使所有文件系统缓冲区保持整洁。最好将便宜的RAM用于某些好东西。使用slabtop参见“之前”和“之后”。


我不明白您的答案与问题有何关系。updatedb关于磁盘使用情况一无所获。如果只是为了遍历磁盘而这样做,将会损害整体性能。
吉尔(Gilles)'所以

3
计算文件大小的du速度很慢,因为您必须访问散布在磁盘上的潜在大量文件的元数据。如果您主动运行updatedb,则所有文件的元数据都将强制存储在RAM中。下次运行任何其他处理大量元数据的操作时,您将使用缓存,而不是在磁盘上进行数千次查找。通常,您很少有机会缓存​​树的元数据的特定部分。使用我的“元数据缓存启动”功能,您极有可能将所需的数据重新缓存。没有物理搜寻==快速。
Marcin

2

如果只需要知道目录的大小,则可以通过避免将信息写入屏幕来大大加快目录的速度。由于总计是du命令的最后一行,因此您可以简单地将其输送到tail

du -hc | tail -n 1

2GB目录结构占用了完整列表的一秒钟时间,但少于此表单的五分之一。


2
我认为这样du -hs做更方便。
勒普

--max-depth 1
stevesliva
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.