吹着空调,喝着茶水的下午,突然一个报警袭扰了美丽的心情。服务器上/下的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


最后,毒奶一波,方法有很多找到一个适合自己的。 最重要的是少掉头发,保护发际线。 安安心心喝茶水