我们的集成环境如果磁盘空间满,一般情况下可以通过删除log或者多余的文件来解决,但有时候,这种方法是无法解决的。以上次碰到情况为例:

服务器10.2.5.4磁盘空间满,致使某核心无法正常运行。于是登陆核查,如下:
# df -h
文件系统              容量  已用 可用 已用% 挂载点

/dev/sda2 9.7G 7.0G 2.3G 76% /
/dev/sda1 251M 19M 219M 8% /boot
/dev/sda5 54G 24G 28G 100% /home
none 1004M 0 1004M 0% /dev/shm
ccvob.alipay.net:/ccvob1
133G 68G 59G 54% /ccvob1
10.2.4.98:/home/nfsshare
225G 145G 69G 68% /share/upload


进入/home目录使用du查看/home下的磁盘使用率

# cd /home
# du -sh *
3.1M admin
1.3G ctu
1.2G godzilla
76K log
40K nagios
609M paygw
784M smsgw
20G trade
24K ukulele

发现目录home目录下的子目录所有文件大小加起来远远少于54G,可是却提示home已经100%占用。这种干扰du查看磁盘空间使用率的问题,一般是下面两种情况造成的:
 1、用户删除了文件,这些删除的文件使用du无法查看,但系统仍然有进程在写被删除的文件。
 2、磁盘分区的某一个目录挂载了另外一个分区时,du查看到的磁盘空间为挂载分区后的目录空间。
由于home目录未挂载另一分区,所以应该是用户删除系统的日志文件,而系统java进程没被停掉这一情况造成的。

解决方法:
1、查找被删除文件
 被删除文件,在写程序未退出的情况下,被删除文件同样会占用磁盘空间。

# lsof -n | head -1
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
# lsof -n /home | grep deleted

由上面可以看出,这些log已经被删除,但是java进程依然在写这些log。

2、杀掉写文件的java进程,磁盘空间会自然释放
#pkill -9 19543
# df
文件系统               1K-块        已用     可用 已用% 挂载点

/dev/sda2 10080520 7257740 2310712 76% /
/dev/sda1 256667 19223 224192 8% /boot
/dev/sda5 56087900 25093392 28145384 45% /home

总结:由于我们经常在没有停掉系统的时候就直接删除log,而有时候系统的java进程在重新启动的时候并没有停掉,依然在系统中运行并不停的在写已经被删除的日志文件,多次累积过后,就会造成磁盘空间变满。所以,建议每次删除系统log前,请执行下#killall java 先将该用户下的系统停掉