Linux 磁盘占用率与使用率不符

Linux 磁盘占用率与使用率不符

记一次磁盘占用率过高问题排查过程与总结

问题描述

一台生产的机子磁盘占用率过高导致 mysql 挂掉,所以需要清理磁盘,使用 du 发现磁盘和 df 的不符

排查过程

第一步,当然是确认磁盘的当前占用率,登陆上机器执行 “df -h” 命令查看挂载盘占用率,果然非常高,已经达到了 96%

磁盘占用率

第二步,确认占用率高的文件夹,排查是哪些文件占用磁盘,执行命令 “du -h --max-depth=1” 发现占用量最大的还是 log 目录

各文件夹占用量

但是却发现了问题,从磁盘占用量我们能看出来,磁盘使用率 96%,Used=179G,可是/data 下各文件夹总的使用量才 86G,那其他被占用的约 100G 的磁盘去哪里了呢?

第三步,搜寻资料,定位问题。根据自己薄弱的运维知识,这超出了我的知识面。谷歌之后发现,这种问题并不离奇是操作系统常见的问题。根据博客 https://www.jianshu.com/p/e775b6880133找到思路。可能是有文件,删除时被系统在使用未真正删除掉,依然占用着磁盘但是又看不到。执行命令 lsof|grep delete来查看删除文件

未被真正删除的文件

果然发现,有一个服务的 log 文件非常大,虽然被删除但是由于服务还在写入所以并未真的删除掉,导致磁盘占用。中间那一行是文件大小,可以看出来差不多 100G。之所以有多条记录,是因为多线程在写入。

第五步,问题处理,面对这样的问题,只有一种处理方式就是重启服务,服务停止后,文件也会被释放,磁盘占用率瞬间下降。

总结:在 window 系统上,如果想删除一个正在被进程使用的文件,系统会阻止删除操作。Linux 也同理,不过 Linux 在删除时不会报错,会假装的让你看到以为删除了,但文件被进程依然关联着并在写入,磁盘占用也还在。但通过 du -h 扫不出来。所以无论在什么系统,不要尝试删除一个正在被进程使用的文件。

知识点总结:

查看磁盘占用率df -h
查看每个文件夹大小du -h --max-depth=1 如果使用 du -h 可以递归看到所有文件大小
查看被进程使用的删除文件lsof|grep delete

ref