查找系统中inode被谁占用

查找系统中inode被谁占用
吹着空调,喝着茶水的下午,突然一个报警袭扰了美丽的心情。服务器上/下的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' | sort | uniq -c | sort -k 1 -n

实战效果:


#find /data5 -xdev -printf '%h' | 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


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

免责声明:本网信息来自于互联网,目的在于传递更多信息,并不代表本网赞同其观点。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,并请自行核实相关内容。本站不承担此类作品侵权行为的直接责任及连带责任。如若本网有任何内容侵犯您的权益,请及时联系我们,本站将会在24小时内处理完毕。
相关文章
返回顶部