吹着空调,喝着茶水的下午,突然一个报警袭扰了美丽的心情。服务器上/下的inode占用多报警了。真心闹心。。。。
按照网上的方式折腾的满头大汗, 依然没解决。真心是姿势不对,后来解决了,然后在这分享下,希望踩坑的同学能够有美好的心情,以及少挠头(少掉头发,每次挠头最少掉两根)。
常见inode占用较多的情况:小文件:一般在缓存文件(squid,nginxcache等) 系统通知
目录一般为 /var 或者数据盘
之前写过一篇处理文件不能创建的文章,里面讲了如何扩容inode,以及清理方法
1 服务器上inode占用情况查看:
# df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda1 1572864 3539 1569325 1% /
tmpfs 16431354 4 16431350 1% /dev/shm
/dev/sda2 1572864 178594 1394270 12% /usr
/dev/sda5 524288 123200 401088 24% /var
/dev/sda4 524288 29 524259 1% /tmp
/dev/sda7 103981056 16632 103964424 1% /data0
/dev/sdb1 60981248 676298 60304950 2% /data1
/dev/sdc1 60981248 16532 60964716 1% /data2
/dev/sdd1 60981248 2408717 58572531 4% /data3
/dev/sde1 60981248 2407120 58574128 4% /data4
/dev/sdf1 60981248 2406214 58575034 4% /data5
/dev/sdg1 60981248 2405827 58575421 4% /data6
/dev/sdh1 60981248 2408070 58573178 4% /data7
不同的服务器不一样,但是吧,这货都能看懂,能一眼看出那个分区的inode不够了。
不够了能怎么办:① 扩容,操作网上一堆, 总结来说,需要有新分区,需要停服务,需要重格式化,很费劲,风险也较大。
② 谁占用干谁,找到问题的根源,那些目录占用的,被那些程序生成的,是否可以清理。
OK,一般采取方法②搞定,那新的问题来了,如何找到这个目录。
不靠谱的方法不说了,说几个可行的:
推荐 a 和 d 速度快,可视性强
a 遍历分区下的全部目录找到最大的:
find /var -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n
实战效果:
#find /data5 -xdev -printf '%h\n' | wc -l
123349
对比系统比较准确:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda5 524288 123200 401088 24% /var
输出为:
...
111 /var/lib/yum/yumdb/h
129 /var/spool/mail
132 /var/lib/puppet/lib/puppet/parser/functions
136 /var/spool/cfengine
161 /var/lib/yum/yumdb/l
172 /var/sysconfbackup
3958 /var/cfengine/inputs/files/userkeys
5058 /var/sinabasesyn/sinabasesyn_node1/userkeys
39214 /var/log/sudo_bak
b 依然是遍历找最大的,略微笨一点:
find /var -exec stat -c "%n %i" {} \;|awk -F "[/ ]" '{if(! a[$1-$NF]++) l[$1]++}END{for (i in l) print i,l[i]}'
123190
for i in $(ls /var/);do echo $i; find $i -exec stat -c "%n %i" {} \;|awk -F "[/ ]" '{if(! a[$1-$NF]++) l[$1]++}END{for (i in l) print i,l[i]}' ;done
然后逐级查找...懒得写了 逐级目录循环吧
c 还是遍历,命令不一样:
for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
或者
for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n
d 使用du命令查看(ps,貌似centos6没有改选项,我这没找到,在centos7上有该参数,应该是软件版本问题:centos6:coreutils-8.4-16 centos7:coreutils-8.22):
du --inodes /var/*
2 找到占用大的目录,判断产生原因,判断是否可以清理
注意碎文件较多,谨慎使用ls 或者 ls -l 可以使用 ls -f (do not sort, enable -aU, disable -ls --color)
删除可以使用,速度较快:
find /xxx/xxx -type f -mtime +7 -delete
或者:
mkdir /newdir/
rsync --delete-before -a -H -v --progress --stats /newdir/ /xxx/xxx
rm -rf /newdir/
3 为啥会产生这些文件,需要查下具体原因
例如:
/var/spool/clientmqueue 目录下会是一些cron或者程序的报错,主要是输出处理不规范导致
附 一篇英文的文章如何找inode
最后,毒奶一波,方法有很多找到一个适合自己的。 最重要的是少掉头发,保护发际线。 安安心心喝茶水