Inodes 占用率 100%导致服务器 50X
开始
某天早上,公司项目突然访问失败,一直重定向,页面打开失败
排查
第一: 根据以往经验,首先定位问题是session存放路径的权限问题,查看过后发现权限是ok的。
第二: 查看nginx日志,没发现问题
第三: 查看项目日志,发现每次访问报错都是报数据表不存在。诡异的直觉告诉我难道数据库被删了,速度查看之后发现并没有
第四:重启服务器,再访问网站还是失败,此时启动mysql服务失败,报错Can 't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock '(2) "
。开始搜索这个错误的解决方法,发现是重启失败导致这个文件没生成,然后去查看my.cnf的配置,socket对应的存放路径是/tmp/mysql.sock
。查看/tmp目录,不存在,尝试创建mkdir tmp
,报错xxxx: No space left on device
。
第五:看到空间不足,我尝试查看磁盘使用情况df -ih
。发现inodes的使用率已达100%。搜解决方法,发现在/var/spool/postfix/maildrop
存在大量的小文件,根据方法删除过后(10多个小时),重启服务器,恢复正常。
挖掘
思考生成这么多小文件的原因,继续搜/var/spool/postfix/maildrop
,发现是crontab惹的祸,它每次的output或者warning都会发送邮件,发送失败就会生成小文件堆积在此目录下。
问题就又变了,怎么导致邮件发送失败,查日志less /var/log/maillog
。发现里面不断地产生IPv6 support is disabled: Address family not supported by protocol
和unable to look up public/pickup: No such file or directory
这两个warning。
搜过后发现是postfix服务有问题,由于postfix的配置inet_protocols = all
设定了同时支持ipv6和ipv4,但是linux默认只支持ipv4,更改配置inet_protocols = ipv4
过后,maillog日志不再报错。
此时还有一点就是crontab的通知实在过于频繁,所以也找了处理方法。
总结
找问题要寻根问底,本来只要删除了小文件就已经解决问题,但是继续思考里面的原因,就发现根本问题是:crontab的通知机制和postfix的配置阴差阳错地才搞了这么一出。
本作品采用《CC 协议》,转载必须注明作者和本文链接
vim /var/log/maillog
作死,请用less
@leo linux小白,立马更正,免得误导群众:see_no_evil: