linux磁盘空间、inode、文件句柄占满等问题的排查、解决方案

摘要

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=””