我最近在开发 Web 服务器上安装了 Munin 以跟踪系统使用情况。我注意到系统的 inode 使用率每天上升大约 7-8%,尽管磁盘使用率几乎没有增加。我猜有些东西正在写大量的小文件,但我找不到什么/在哪里。
我知道如何查找磁盘空间使用情况,但我似乎找不到总结 inode 使用情况的方法。
有没有一种按目录确定 inode 使用情况的好方法,以便我可以找到使用的来源?
我最近在开发 Web 服务器上安装了 Munin 以跟踪系统使用情况。我注意到系统的 inode 使用率每天上升大约 7-8%,尽管磁盘使用率几乎没有增加。我猜有些东西正在写大量的小文件,但我找不到什么/在哪里。
我知道如何查找磁盘空间使用情况,但我似乎找不到总结 inode 使用情况的方法。
有没有一种按目录确定 inode 使用情况的好方法,以便我可以找到使用的来源?
不要指望这会很快运行......
cd 到您怀疑可能存在包含大量 inode 的子目录的目录。如果此脚本花费大量时间,您可能已经找到了文件系统中的查找位置。/var 是一个好的开始...
否则,如果您切换到该文件系统中的顶级目录并运行它并等待它完成,您将找到包含所有 inode 的目录。
我不担心分类的成本。我运行了一个测试,对 350,000 个目录的未排序输出进行排序花了 8 秒。最初的发现花了。真正的成本是在 while 循环中打开所有这些目录。(循环本身需要 22 秒)。(测试数据在具有 350,000 个目录的子目录上运行,其中一个有 100 万个文件,其余的有 1 到 15 个目录)。
很多人指出 ls 并不擅长,因为它对输出进行排序。我试过回声,但这也不是很好。其他人指出 stat 提供了此信息(目录条目数),但它不可移植。事实证明 find -maxdepth 在打开目录和计算 .files 方面真的很快,所以......这里是......每个人的积分!
如果问题是一个目录有太多文件,这是一个简单的解决方案:
该
find
行背后的想法是目录的大小与直接在该目录中的文件数量成正比。因此,我们在这里寻找包含大量文件的目录。如果您不想猜测一个数字,而是希望列出所有按“大小”排序的可疑目录,那也很容易:
Grrr,评论需要 50 个代表。所以这个答案实际上是对克里斯答案的评论。
由于提问者可能不关心所有目录,只关心最差的目录,因此使用排序可能非常昂贵。
这不像您的版本那样完整,但是如果它们大于之前的最大值,它会打印行,从而大大减少打印出的噪音量,并节省排序的费用。
这样做的缺点是,如果您有 2 个非常大的目录,并且第一个目录恰好比第二个目录多 1 个 inode,那么您将永远看不到第二个目录。
一个更完整的解决方案是编写一个更智能的 perl 脚本来跟踪看到的前 10 个值,并在最后打印出来。但这对于快速的服务器故障答案来说太长了。
此外,一些更智能的 perl 脚本可以让您跳过 while 循环 - 在大多数平台上, ls 对结果进行排序,这对于大型目录也可能非常昂贵。这里不需要 ls 排序,因为我们只关心计数。
您可以使用这个小片段:
它将打印出当前文件夹中每个目录中有多少文件和目录,最大的违规者位于底部。它将帮助您找到包含大量文件的目录。(更多信息)
这不是您问题的直接答案,但使用 find 搜索最近修改过的小文件可能会缩小您的搜索范围:
ls不会找到名称以句点开头的文件。使用find可以避免这种情况。这将查找目录树中的每个文件,从每个路径的末尾删除基本名称,并计算每个目录路径出现在结果输出中的次数。您可能必须输入“!” 如果您的外壳抱怨它,请用引号引起来。
Inodes 也可能被已被删除但被正在运行的进程保持打开的文件用完。如果这个 Munin 包包含任何持续运行的程序,另一件要检查的事情是它是否打开了异常数量的文件。
我会暴力破解这个:在整个设备上运行tripwire作为基线,然后过一段时间再运行检查,有问题的目录会像拇指一样突出。
(不能发表评论真的变老了——这是为了 egorgry)
egorgry - ls -i 打印条目的 inode NUMBER,而不是 inode COUNT。
用你目录中的一个文件试试——你(可能)会看到一个同样高的数字,但这不是 inode 的数量,它只是你的目录入口指向的 inode #。
更新
返回给定目录的每个子目录的 inode 计数的单行,其中最大的条目位于底部。
原始答案
像这样运行它(假设上面的脚本驻留在您工作目录中的可执行文件中)
每个文件或目录的 inode 使用量大约是一个,对吧?也一样
大致计算 [path] 下使用了多少 inode。