服务器磁盘100%占用问题
今天服务器/home下挂载的磁盘占用100%告警,我在线上排查问题。
我先一套三连甩过去:
1 | df -h |
发现目前/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 |