现象描述:
凌晨收到值班同事电话,一台DB服务器var分区报警,显示磁盘空间(inodes)不足%15,具体告警内容如下:
问题分析:
收到电话后第一印象可能是由于/var/log下的日志、/var/spool/clientmqueue导致var分区占用空间较大。
处理步骤:
登陆服务器,通过df -h 查看磁盘空间使用情况。
df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda7 6.0G 493M 5.2G 9% /
tmpfs 32G 0 32G 0% /dev/shm
/dev/sda1 124M 57M 62M 49% /boot
/dev/sda8 1.1T 84G 929G 9% /home
/dev/sda2 6.0G 2.1G 3.6G 37% /usr
/dev/sda3 4.0G 1.7G 2.2G 44% /var
发现磁盘使用空间还有很多,为什么zabbix监控会报出var磁盘分区不足%15的使用情况呢?告警内容已经提示是inodes不足,下面就给出答案:
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda7 393216 9179 384037 3% /
tmpfs 8240103 1 8240102 1% /dev/shm
/dev/sda1 32768 46 32722 1% /boot
/dev/sda8 71000064 12127 70987937 1% /home
/dev/sda2 393216 87909 305307 23% /usr
/dev/sda3 262144 222981 39163 86% /var
这里我们看到var分区的inode使用情况已经不足%15了,因此我们可以明白为什么会收到那条告警信息了。了解了为什么,那么就具体寻找var下面哪个目录较大、零碎文件较多,从而清理分区空间。
通过cd /var/ ,通过du -hs * 发现磁盘空间最大的文件来自/var/spool目录,第一印象可能是/var/spool/clientmqueue,但进入发现实际占用较大空间的是/var/spool/postfix/maildrop
这个目录,这个目录一般是系统邮件的回收站,删除、丢弃的邮件会放到这里,我们只需要删除这里的文件即可腾出多余的INode,从而减低/var空间使用率。
cd /var/spool/postfix/maildrop
ls |xargs -n 10 rm -rf
df -i
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sda7 393216 9179 384037 3% /
tmpfs 8240103 1 8240102 1% /dev/shm
/dev/sda1 32768 46 32722 1% /boot
/dev/sda8 71000064 12127 70987937 1% /home
/dev/sda2 393216 87909 305307 23% /usr
/dev/sda3 262144 2409 259735 1% /var
此时磁盘inode明显降低,告警也随之消除。
深入分析:
为何/var/spool/postfix/maildrop目录会生成大量的文件?
cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
cat /etc/cron.d/0hourly
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
这里删除邮件会自动存储root用户下的/var/spool/postfix/maildrop目录中,我们可以通过以下方式避免:
将MAILTO=root修改为MAILTO=空值即可,然后重启crond服务 ( service crond restart)。
知识扩展:
1)目录/var/spool/clientmqueue/也容易产生较多的零碎文件,其原因是由于系统中有用户开启了cron任务,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件。解决办法如下:
清理/var/spool/clientmqueue/下面的文件,cd /var/spool/clientmqueue/ ;ls |xargs -n 10 rm -rf ;
查看产生/var/spool/clientmqueue/文件的内容,找到对应的具体cron任务
将任务脚本输出添加 >/dev/null 2>&1
2)如果通过df -h 和 df -i发现 分区空间很大,但里面文件几乎没有,即磁盘空间没有被释放。导致这种原因一般是由于磁盘有些进程用到了这个分区下的文件,用户在没有停掉进程的情况下清理了这些文件,但进程还在,从而磁盘空间没有被释放。解决方法如下:
lsof|grep deleted
mysqld 5668 mysql 5u REG 8,3 0 1572866 /tmp/ibHVyCeJ (deleted)
mysqld 5668 mysql 6u REG 8,3 0 1572871 /tmp/ibW1Z6Gn (deleted)
mysqld 5668 mysql 7u REG 8,3 0 1572922 /tmp/ibz4HB91 (deleted)
mysqld 5668 mysql 8u REG 8,3 0 1572923 /tmp/ibFbld7k (deleted)
mysqld 5668 mysql 12u REG 8,3 0 1572924 /tmp/ibMFN1EZ (deleted)
找到进程,直接杀死即可(也可以通过重启操作系统解决)