我正在寻找最有效的方法来确定 5 PB 磁盘上目录的磁盘空间使用情况。
我尝试分析的目录位置如下:
/disk/user1/task1/
/disk/user1/task2/
/disk/user2/task3/
/disk/user100/task1/
ETC
我需要找到每个的大小任务并想知道最有效的命令是什么。
目前我已经尝试过ncdu -rx
(这看起来需要几天时间)。
有人知道更好的方法吗?
我不是最擅长这些命令,所以如果能详细说明答案,我将不胜感激。
答案1
我会使用一个变体如何在命令行上获取目录的大小?-
du -sm /disk/user*/task* | sort -n | tee /tmp/disk-usage.rpt
它做了三件事:
-s
收集所有用户目录下每个任务目录的磁盘使用量总和 ( ),以兆字节为单位 (-m
)- 按第一列对输出进行数字排序;这会将最大的任务目录放在底部;通过反转排序将它们放在顶部
sort -rn
- 将该输出的副本发送到您的屏幕和 /tmp/disk-usage.rpt 中的文件
保存的文件副本使您不必重新运行命令du
(除非您愿意)来重新调查下一个最大的任务目录。
答案2
在这种情况下,缓慢的部分不是文件的大小,而是文件的数量。ncdu
、du
、 和它们的同类需要stat()
ing 每个文件,所以如果有很多文件,您将会遇到麻烦。
如果文件大小与文件数量相关(例如,如果每个文件的文件大小受到限制),您可能会幸运地计算它们并首先按目录分组以缩小列表范围。在基本情况下,这stat()
根本不涉及发行,大部分只是readdir()
.
fstat()
不幸的是,无论如何,至少在我的系统上,GNU find 等常见工具会为每个文件发出问题。您可以相当轻松地编写一个小型 C 程序来解决这个问题,只需使用opendir
、readdir
和计算返回的对象数量。
如果文件大小与文件数量无关,那么你就不走运了。考虑将来以允许 O(1) 或使用较小分区的类似方式计算磁盘大小的方式设置文件系统,或者使用 btrfs 子卷(也具有 O(1) 计算)之类的东西。