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 所提到的,agedu确实创建了一个索引。在阅读了有关locatedb. 您可以locatedb从du输出创建自己的 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 的一个很好的使用。
| 归档时间: |
|
| 查看次数: |
41878 次 |
| 最近记录: |