我最近在开发 Web 服务器上安装了 Munin,以跟踪系统使用情况。我注意到系统的 inode 使用率每天上升约 7-8%,尽管磁盘使用率几乎没有增加。我猜有什么东西在写入大量小文件,但我找不到是什么/在哪里。
我知道如何查找磁盘空间使用情况,但似乎找不到总结 inode 使用情况的方法。
是否有一个好的方法来确定目录的 inode 使用情况,以便我可以找到使用来源?
答案1
不要指望这会很快运行......
cd 到您怀疑可能存在包含大量 inode 的子目录的目录。如果此脚本花费大量时间,则您可能已经找到文件系统中要查找的位置。/var 是一个不错的开始...
否则,如果您更改为该文件系统中的顶级目录并运行此程序并等待其完成,您将找到包含所有 inode 的目录。
find . -type d |
while
read line
do
echo "$( find "$line" -maxdepth 1 | wc -l) $line"
done |
sort -rn | less
我并不担心排序的成本。我进行了测试,对 350,000 个目录的未排序输出进行排序需要 8 秒。初始查找需要 。真正的成本是在 while 循环中打开所有这些目录。(循环本身需要 22 秒)。(测试数据在一个包含 350,000 个目录的子目录中运行,其中一个目录有 100 万个文件,其余目录有 1 到 15 个目录)。
很多人指出 ls 在这方面表现不佳,因为它会对输出进行排序。我试过 echo,但效果也不好。还有人指出 stat 提供了此信息(目录条目数),但它不可移植。事实证明 find -maxdepth 在打开目录和计数 .files 方面非常快,所以... 这就是它... 每个人都有积分!
答案2
如果问题是一个目录中有太多文件,这里有一个简单的解决方案:
# 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
这句话的意思find
是,目录的大小与目录内的文件数量成正比。因此,我们在这里寻找包含大量文件的目录。
如果您不想猜测数字,而希望按“大小”顺序列出所有可疑目录,这也很容易:
# Remove the "sort" command if you want incremental output
find / -xdev -size +10k -type d -printf '%s %p\n' | sort -n
答案3
呼呼,评论需要 50 点声望。所以这个答案实际上是对克里斯的答案的评论。
由于提问者可能并不关心所有目录,而只关心最差的目录,因此使用排序很可能是一种代价高昂的过度杀伤。
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
这不像您的版本那么完整,但是如果行大于之前的最大值,它就会打印行,从而大大减少打印出来的噪音量,并节省排序的费用。
这样做的缺点是,如果您有 2 个非常大的目录,而第一个目录恰好比第二个目录多 1 个 inode,那么您永远看不到第二个目录。
更完整的解决方案是编写一个更智能的 perl 脚本,跟踪看到的前 10 个值,并在最后打印出来。但这对于快速的服务器故障答案来说太长了。
此外,一些更智能的 perl 脚本可以让你跳过 while 循环 - 在大多数平台上,ls 会对结果进行排序,这对于大型目录来说也可能非常昂贵。ls 排序在这里不是必需的,因为我们关心的只是计数。
答案4
这不是对您的问题的直接回答,但使用 find 搜索最近修改的较小文件可能会缩小您的搜索范围:
find / -mmin -10 -size -20k