摘要
本文部分内容来源于网络,个人收集整理,请勿传播
linux服务器维护过程中,可能会碰到一些磁盘空间的问题而不知道如何处理,因此本文仅针对这类磁盘问题做一个排查、处理、如何避免的总结。
磁盘空间被占满
1 | df -h |
问题发生原因
- 没有磁盘监控以及报警
- 没有自动清除日志任务
- 业务量突增上涨
- 等奇葩问题
可能导致的问题
- 程序因无法写入导致业务无法访问
- 普通用户无法登陆系统
- 服务停止后无法启动
- 等
解决办法
- 做好监控报警
- 做好自动清理日志任务
清理日志之后空间不释放
当磁盘空间被占满之后,删除了某些日志却发现空间并没有释放,或者释放的空间没有删掉的日志大,原因是删掉的文件正好有服务在调用,而此时删掉的文件是不会释放空间的。
查看已经删除没有释放的文件
1 | lsof | grep delete |
确认了是哪个服务在占用之后重启相应服务就可以解决了。
inode满了
1 | df -i |
问题发生原因
- 生成了大量的小文件占满了磁盘inode
- 没有磁盘监控以及报警
- 某些应用产生缓存或者临时文件并且量比较大
- 频繁的计划任务,没有关闭邮件通知,邮件发送失败
可能导致的问题
同上
解决办法
没有想到更加便捷的方式,所以使用以下很笨的方式来查找哪个目录占用inode较多,然后看到哪个目录文件数多再一层一层往下找
1 | find . |awk -F "[/]" '{l[$2]++}END{for (i in l) print i,l[i]}' |
一般情况都是crond导致的,问题成因:crond在执行脚本时会将脚本输出信息以邮件的形式发送给系统用户,所以必然要调用sendmail,而sendmail又会调用postdrop发送邮件,但是如果系统的postfix服务没有正常运行,那么邮件就会发送不成功,导致持续写入日志到日志文件,造成sendmail、postdrop、crond进程就无法正常退出,形成大量的僵尸进程
解决办法:先把僵尸进程都干掉ps -ef | egrep “sendmail|postdrop” | grep -v grep |xargs kill,让内存降下来
为防以后postfix挂了再出现类似问题,可以进行如下配置,将crond的邮件通知关闭:
将/etc/crontab和/etc/cron.d/0hourly里的MAILTO=root修改为MAILTO=””
crontab -e第一行增加一段MAILTO=””