请启用 Javascript 以查看内容

删除文件后 df 查看磁盘空间并没有释放

 ·  ☕ 2 分钟  ·  ✍ CNSRE

作者:SRE运维博客

博客地址: https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/211029955133/

相关话题:https://www.cnsre.cn/tags/故障集/


前言

Linux 磁盘空间总是报警,查到到大文件,删除之后,df看到磁盘空间并没有释放。

du -sh ./* | sort -nr (查看当前目录下文件的大小)通过查找了下发现文件被mysql 的zabbix库占用了 zabbix 已经迁移可以删除

sre运维|Linux运维|自动化运维|关键词

rm 删除之后 df 查看 发现磁盘空间并没有得到释放

执行 lsof | grep deleted 发现有大量刚刚删除文件的进程存在

sre运维|Linux运维|自动化运维|关键词

kill掉进程(或者重启进程) OK

sre运维|Linux运维|自动化运维|关键词

问题分析

一般说来不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件被进程锁定,或者有进程一直在向这个文件写数据等等,要理解这个问题,就需要知道Linux下文件的存储机制和存储结构。

一个文件在文件系统中的存放分为两个部分:数据部分和指针部分,指针位于文件系统的 meta-data 中,数据被删除后,这个指针就从 meta-data 中清除了,而数据部分存储在磁盘中,数据对应的指针从 meta-data 中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除 access_log 文件后,空间还没释放,就是因为 httpd 进程还在一直向这个文件写入内容,导致虽然删除了 access_log 文件,但文件对应的指针部分由于进程锁定,并未从 meta-data 中清除,而由于指针并未被删除,那么系统内核就认为文件并未被删除,因此通过 df 命令查询空间并未释放也就不足为奇了。

处理问题

既然有了解决问题的思路,那么接下来看看是否有进程一直在向文件中写,这里需要用到 Linux 下的 lsof 命令,通过这个命令可以获取一个已经被删除但仍然被应用程序占用的文件列表,命令执行如下图所示:

sre运维|Linux运维|自动化运维|关键词


作者:SRE运维博客

博客地址: https://www.cnsre.cn/

文章地址:https://www.cnsre.cn/posts/211029955133/

相关话题:https://www.cnsre.cn/tags/故障集/


分享

Avatar
作者
CNSRE
一位只会重启的运维


目录