上一篇: php的memcache模块的优化
df和du显示空间为何不一致
[ 2009/07/30 12:02 | by selboo ]
有台机器空间老是显示满,df显示已经使用了100%,可用du命令却没见占用很多空间,后来终于在网上查到了原因所在:
造成这个现象的原因是有进程仍然打开着已经被删除的文件。因为该文件已经不存在于文件目录树上,所以du遍历整个文件系统中不会统计其所占用的空间,可是,这个文件又还不能被从磁盘上删除,所以确实还占用了一部分磁盘空间。
可以用lsof来确定究竟是哪个进程搞的鬼,比如:
# lsof | grep deleted
sendmail 31818 hsq 3uW REG 8,5 194523136 457053 /var/spool/clientmqueue/dfm9TAh6du031818 (deleted)
sendmail 31818 hsq 3uW REG 8,5 194523136 457053 /var/spool/clientmqueue/dfm9TAh6du031818 (deleted)
上面这个例子显示tail(pid为31818)进程打开了一个已经被删除的文件(/var/spool/clientmqueue/dfm9TAh6du031818 ),这个文件大小为457053。此时,如果终止这个进程,那么这457053多字节就会正常释放,df的输出也就和du一致了。
曾经遇到过此类问题的报告,似乎杀了sendmail就好了。当时不知原由,现在想来,可能是系统长时间运行后sendmail的日志经过了rotate,而sendmail仍然打开着旧的日志文件。
以后再遇到此类情况,直接用lsof命令,查看是哪些进程占用着已删除文件,就可相机处理了。