时不时地,我们的一台或多台服务器会宣布它的磁盘容量已达到 90%,然后我们就会在其上运行某种“du”程序,深入研究并找出什么是如此之大或什么增长得如此之快,当然,这在越来越大的磁盘上会花费越来越多的时间。
当然,我们可以每晚运行一次,但这些问题往往会爆发性地发生。:)
是否有任何文件系统支持解决此问题而无需扫描整个磁盘?也许有一个守护进程可以监视文件活动以维护细粒度的使用树或“最大文件”列表等?
答案1
据我所知,除了使用扫描整个文件系统的工具来查找当前占用大量磁盘空间之外,没有其他真正的替代方法。目录元数据根本无法保存有关其子目录和子目录的子目录的足够信息,因此无法避免逐个扫描所有子目录和文件并创建磁盘使用情况统计。
du
回避策略
Check open file descriptors
通常,第一层的方法和假设是正在写入的单个大文件是罪魁祸首,您可以将搜索限制在当前打开的文件并仅检查这些文件的大小。
有关使用方法的详细内容,lsof
请参阅:https://unix.stackexchange.com/q/382693/48232
类似的事情将会是du -sL /proc/*/fd/* |sort -n
,然后跟随最有趣的文件描述符链接:
du -sL /proc/*/fd/* |sort -n
...
6344 /proc/873/fd/11
6344 /proc/873/fd/12
6344 /proc/873/fd/13
20140 /proc/359/fd/62
2028890 /proc/876/fd/6
ls -l /proc/876/fd/6
lrwx------. 1 root root 64 Sep 8 10:09 /proc/876/fd/6 -> /var/log/httpd/example.net_access_log
iotop
类似的 IO 监控允许您识别生成最多 IO 的进程。一旦您拥有了它,PID
您就可以运行ls -l /proc/[PID]/fd/*
并查看进程正在写入的确切位置。这允许您识别可能正在写入许多较小文件而不是单个大文件的当前活动进程。
Quota
不再流行并且您的里程可能会有所不同,但(事先)在文件系统上启用配额有几个潜在的优势。
- 设置硬配额和软配额限制,违规的失控用户/进程将在完全填满文件系统并阻碍其他用户/进程之前被停止
- 即使设置了无限的配额,磁盘配额报告也是一种快速简便的方法,可以确定谁、哪些用户/组 ID 占用了最多的磁盘空间。
Partitioning
尽管在其他方面,PITA 为用户/应用程序设置他们自己的卷/分区/文件系统而不是仅使用单个根文件系统允许您快速运行,df
从而限制您需要进行的搜索量。
快速(更)了解磁盘使用情况
而不是运行du --max-depth=2 <some-filesystem> | sort -n
或类似操作(由于|
管道只显示结果后整个文件系统已被扫描)我通常运行
du --max-depth=2 <some-filesystem> | tee /tmp/du.txt
在一个窗口和另一个窗口中:
watch -n 1 "sort -nr < /tmp/du.txt"
其优点在于你可以立即看到一些进展。
ncdu
对我来说,这个du
命令通常很有用,它总是被安装,而且比例如可敬ncdu
,它首先需要构建磁盘使用情况缓存,然后才能向您呈现公认的美观且实用的导航 TUI,让您可以深入了解最大的目录。
duc
Debian 和 Ubuntu 带有可选duc
这仍然需要您对目录树/文件系统进行(初始)完整扫描,但也会保留磁盘使用情况缓存。duc
还允许更新现有的磁盘使用情况缓存,这对于后续运行来说应该更快。
ncdu
TUI 界面与完整的 GUI类似,但提供了一些非常好的使用图表。演示:https://duc.zevv.nl/demo.cgi?x=338&y=181&path=/