Dav*_*gac 16 linux disk-space-utilization inode
我最近在开发 Web 服务器上安装了 Munin 以跟踪系统使用情况。我注意到系统的 inode 使用率每天增加约 7-8%,即使磁盘使用率几乎没有增加。我猜有些东西正在写大量的小文件,但我找不到什么/在哪里。
我知道如何查找磁盘空间使用情况,但似乎找不到总结 inode 使用情况的方法。
有没有一种好方法可以按目录确定 inode 的使用情况,以便我可以找到使用的来源?
chr*_*ris 18
不要指望这会运行得很快......
cd 到您怀疑可能有包含大量 inode 的子目录的目录。如果此脚本花费大量时间,您可能已经在文件系统中找到了要查找的位置。/var 是一个好的开始...
否则,如果您切换到该文件系统中的顶级目录并运行它并等待它完成,您将找到包含所有 inode 的目录。
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
Run Code Online (Sandbox Code Playgroud)
我不担心分拣的成本。我运行了一个测试,对 350,000 个目录的未排序输出进行排序花了 8 秒。最初的发现花了。真正的代价是在 while 循环中打开所有这些目录。(循环本身需要 22 秒)。(测试数据在一个包含 350,000 个目录的子目录中运行,其中一个有 100 万个文件,其余的有 1 到 15 个目录)。
很多人都指出 ls 不是很好,因为它对输出进行了排序。我试过回声,但这也不是很好。其他人指出 stat 提供了此信息(目录条目数),但它不可移植。事实证明, find -maxdepth 在打开目录和计算 .files 方面非常快,所以......这里是......给每个人的点数!
如果问题是一个目录包含太多文件,这里有一个简单的解决方案:
# Let's find which partition is out of inodes:
$ df -hi
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda3 2.4M 2.4M 0 100% /
...
# Okay, now we know the mount point with no free inodes,
# let's find a directory with too many files:
$ find / -xdev -size +100k -type d
Run Code Online (Sandbox Code Playgroud)
这find条线背后的想法是目录的大小与该目录中直接的文件数量成正比。所以,在这里我们寻找里面有大量文件的目录。
如果您不想猜测一个数字,而更愿意列出所有按“大小”排序的可疑目录,那也很容易:
# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n
Run Code Online (Sandbox Code Playgroud)
Grrr,评论需要50个代表。所以这个答案实际上是对克里斯答案的评论。
由于提问者可能并不关心所有目录,只关心最糟糕的目录,因此使用 sort 可能是非常昂贵的矫枉过正。
find . -type d |
while
read line
do
echo "$(ls "$line" | wc -l) $line"
done |
perl -a -ne'next unless $F[0]>=$max; print; $max=$F[0]' | less
Run Code Online (Sandbox Code Playgroud)
这不像你的版本那么完整,但是如果它们大于以前的最大值,它会打印线,大大减少打印出来的噪音量,并节省排序费用。
这样做的缺点是,如果您有 2 个非常大的目录,而第一个目录恰好比第二个目录多 1 个 inode,您将永远看不到第二个。
一个更完整的解决方案是编写一个更智能的 perl 脚本来跟踪所看到的前 10 个值,并在最后将它们打印出来。但这对于快速的服务器故障答案来说太长了。
此外,一些中等智能的 perl 脚本可以让您跳过 while 循环——在大多数平台上,ls 对结果进行排序,这对于大目录来说也可能非常昂贵。这里不需要 ls 排序,因为我们只关心计数。
你可以使用这个小片段:
find | cut -d/ -f2 | uniq -c | sort -n
Run Code Online (Sandbox Code Playgroud)
它将打印出当前文件夹中每个目录中有多少文件和目录,最大的违规者在底部。它将帮助您找到包含大量文件的目录。(更多信息)