inode使用率过高
突然收到报警,有台机器提示inode使用率过高。一开始只注意到监控项名字有disk字眼,以为还是磁盘空间预警,跑机器上执行下 df -h
,发现还很充足。原来报警监控项是inode使用率过高,然而磁盘还很充足,说明是小文件太多了,占用了过多inode资源。
inode
inode用来描述文件的元信息,用整数表示。如stat a.log
stat命令即是展示inode元信息。使用 ls -i
也可以查看文件的inode号。
inode元信息当然也需要占用磁盘空间,磁盘分给数据区和inode区。数据区即是文件数据,inode区存放元信息描述。 通常一个文件就占用一个inode资源。
硬链接是多个文件使用同一个inode,删除一个文件其他还能打开
软链接是使用不同的inode,删除源文件,则不能再打开
当小文件个数很多时,就存在这样case,磁盘空间够用,但不能再创建文件了。
df -i
可以查看inode使用率。inode使用率过高需要删除这些小文件。
shell
写一个shell脚本递归统计下各目录包含文件个数,找出超过一定数量的目录。
主要利用命令 find dirname | wc -l
#!/bin/bash
# maxNum表示该层目录下文件个数,默认10000个
if [ ! -n "$1" ]; then
maxNum=10000
else
maxNum=$1
fi
inodeCount() {
# 函数内接收参数
dirname=$1
for i in $dirname/*; do
num=$(find $i | wc -l)
# shell数字比较利用 -eq -gt等表达
if [ $num -gt $maxNum ]; then
echo $num $i
# 递归深入具体目录下 函数传参表达方式
inodeCount $i
fi
done
}
inodeCount
解决
找到了是这个目录下 /var/spool/postfix/maildrop/
小文件过多。先确定可以删了,删除后再运行df -i
,inode资源使用马上下降了。
查了其他几个业务机器,占用都是1%,为啥就这台机器这个目录会有这么多文件呢? 网上查了下原因是定时任务运行就会产生一个小文件在这,的确这个机器在跑一些定时任务。
需要把任务运行产生的标准输出或者标准错误输出出去就好了, > /dev/null