描述

客户生产服务(Linux) ETL 进程卡死,执行 df -h 命令发现 /home 目录所在磁盘占用率接近 100%,扩容需要层层审批显然来不及了,随即将一些大文件备份删除,并且将存放源数据的文件夹通过软链的方式临时换到其他目录,再次执行 ETL 立马又 100% 了。

检测

执行 du -h --max-depth=1 /home查看文件占用情况,发现使用还不到 /home 的一半;起初以为是有隐藏文件,又用 du -ah --max-depth=1 /home 命令检查了一遍,得到的结果是一样的。

通过网络搜索得到大概率是因为一些被删除的文件仍被某个进程占用,平时没在 /home 目录装过软件、交换数据这些操作;也没碰到过分配过这么小的情况。

最终原因:用户删除了大量的文件后,du 命令就不会在文件系统目录中统计这些文件;如果此时还在运行中的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df 命令仍会统计这个被删除的文件。

方案

  • 服务器没有 7*24 的业务要求的话,直接重启就行。
  • 找到相应的进程,使用 kill -9 <pid> 将其杀掉即可:有 lsof 命令的话,执行 lsof | grep deleted 即可得到进程。

说明

  • 查找大文件可以使用 find /home -type f -size +100M -exec du -h {} + 命令。
  • 目录小的情况下,千万不用用来做数据交换之类的操作,同时请规范使用 home 目录。