/var 目录爆满

一台服务器刚用没多久就出现了磁盘爆满的情况:

[deploy@unode01 ~]$ df -TH
Filesystem    Type     Size   Used  Avail Use% Mounted on
….
/dev/sda6     ext4      21G   20G       5M  100% /var
….

去 /var/ 下看看哪些文件占用了磁盘空间:

[deploy@unode01 ~]$ sudo du -sh /var/*
1.2M    /var/backups
138M    /var/cache
1.7G    /var/lib
4.0K    /var/local
0       /var/lock
21M     /var/log
16K     /var/lost+found
4.0K    /var/mail
4.0K    /var/opt
52K     /var/run
32K     /var/spool
4.0K    /var/tmp

可以看到 lib/ 占用了大部分的空间,继续排查:

[deploy@unode01 lib]$ sudo du -s ./* | sort -n

84      ./ucf
192     ./update-rc.d
364     ./usbutils
380     ./aptitude
4368    ./mlocate
15632   ./dpkg
127928  ./apt
1595884 ./mysql

[deploy@unode01 mysql]$ cd mysql
[deploy@unode01 mysql]$ sudo du  ./*  | sort -n

5120    ./ib_logfile1
10240   ./ibdata1
1574424 ./data

可以发现是 data/ 目录下的数据占据了大部分的空间,但是有趣的是,通过 du 发现,整个 /var/ 下的 data/ 并没有占到 20G 的空间,很自然的联想到是由于删除该目录下的数据后,某些程序没有及时的释放这部分的资源:

[deploy@unode01 ~]$ sudo lsof | grep deleted

mysqld    14315    mysql   51r      REG                8,6         0    1048633 /var/lib/mysql/mysql/slow_log.CSV
mysqld    14315    mysql   74u      REG                8,6      2048    1048534 /var/lib/mysql/data/promotion_log.MYI (deleted)
mysqld    14315    mysql   75u      REG                8,6         0    1048533 /var/lib/mysql/data/promotion_log.MYD (deleted)
mysqld    14315    mysql   76u      REG                8,6  70332416    1048623 /var/lib/mysql/data/promotion_log_20110912.MYI (deleted)
mysqld    14315    mysql   77u      REG                8,6 509206452    1048627 /var/lib/mysql/data/promotion_log_20110912.MYD (deleted)

发现了问题的所在,释放该资源即可,重启是一种方式,但是最佳的办法还是杀死该进程:

[deploy@unode01 ~]$ sudo kill 14315

再来看一下:

[deploy@unode01 ~]$ df -TH
Filesystem    Type    Size  Used Avail Use% Mounted on

/dev/sda6     ext4     19G  2.0G   16G  12% /var

可以看到现在 /var/ 恢复了。

为了更好的理解,我们可以做一个简单的实验,在一个窗口中使用 less 打开某个文件,在另一个新的会话中 rm 该文件,使用 lsof 就会发现类似上面的现象了。