服务器磁盘100%占用问题

今天服务器/home下挂载的磁盘占用100%告警,我在线上排查问题。

我先一套三连甩过去:

1
2
3
df -h
du -h --max-depth=1
ds -sh *

发现目前/home下文件占的内容只占总容量的30%左右,那剩下的磁盘占用去哪了呢?

不得已,继续排查哪里有大文件,找一下之前删除的文件占用的磁盘。

1
lsof | grep delete

一查下一跳,之前删除的文件基本都是假死脱身,然后就开始扫垃圾,杀掉这些进程。

1
kill -9 `lsof | grep delete | awk '{print $2}'` 

事情就告一段落,问题就解决了,但是为什么会出现这个问题呢?

这是因为要删除的文件还在被别的程序引用,rm掉这个文件只是删去了文件系统对它的一个索引,导致不能在文件夹中找到。实际上,它仍然存在,创建这个文件的进程往往存在对该文件的索引并且可能还在使用它。

举个例子,后台启动一个jar包:

1
nohup java -jar test.jar &

启动成功后,我们将删除它打印的日志文件nohup.out,但是test.jar对它实际上是依然有引用的,所以在test.jar运行期间删除nohup.out文件实际上是没有删掉的。

那么正确的删除方式是什么呢?

仅在没有链接时删除才释放该空间,用上面这个例子来说就是在test.jar停止运行的时候删除nohup.out文件才是真正被删除。当然我们在大多时候不清楚它究竟有没有被引用,但是需要了解这类情况以便我们能更好的解决问题。

顺便记住这个命令吧!

1
lsof | grep delete