专栏首页一个程序员的修炼之路Linux中删除文件,磁盘空间未释放问题追踪

Linux中删除文件,磁盘空间未释放问题追踪

在客户使用我们产品后,发现一个问题:在删除了文件后,磁盘空间却没有释放。是有进程在打开这个文件,还是其他情况?我们一起来看看一下两个场景

一. 场景一:进程打开此文件

当一个文件正在被一个进程使用时,用户删除此文件,文件只会从目录结构中删除,但并没有从磁盘删除。当使用这个文件的进程结束后,文件才会真正的从磁盘删除,释放占有的空间。

我们发现剩余磁盘空间比较少时,回去删除一些大的临时文件或者log文件,如果删除之后会发现磁盘空间并未减少,那么可以通过“lsof”命令去查看正在使用该文件的进程,然后再重启该进程或者服务。

【例子】

现在发现磁盘空间的占用了99%,剩余空间只剩下522M。

+++++++++++++++++++++++++++++++++++++++

SUSE11X64-001:/test # df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 29G 27G 522M 99% /

devtmpfs 972M 116K 972M 1% /dev

tmpfs 972M 0 972M 0% /dev/shm

+++++++++++++++++++++++++++++++++++++++

找到一个文件"vmcore"占用了接近900M空间,但这个文件不需要再使用了,于是采用“rm”命令删除此文件,可是删除后,发现磁盘空间并没有真正的减少。

SUSE11X64-001:/test # rm vmcore

SUSE11X64-001:/test # df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 29G 27G 522M 99% /

devtmpfs 972M 116K 972M 1% /dev

tmpfs 972M 0 972M 0% /dev/shm

//10.204.16.2/home/splx/iceking 6.3T 1.6T 4.7T 25% /mnt/iceking

也就是说很有可能有其他进程正在使用这个文件,使用“lsof”命令去查看正在使用该文件的进程。

+++++++++++++++++++++++++++++++++++++++

SUSE11X64-001:/test # lsof | grep vmcore

a.out 2610 root 3r REG 8,2 941331144 1643779 /test/vmcore (deleted)

+++++++++++++++++++++++++++++++++++++++

进程号为2610(进程名为"a.out")的进程,正在使用vmcore文件,也可以看到其后有“deleted”:其表示正在使用的文件被删除,但并没有真正从磁盘上移除。

现在我们删除这个进程,并查看磁盘空间此时占用率降低为95%,剩余空间增加到1.4G。

+++++++++++++++++++++++++++++++++++++++

SUSE11X64-001:/test # df -h

Filesystem Size Used Avail Use% Mounted on

/dev/sda2 29G 26G 1.4G 95% /

devtmpfs 972M 116K 972M 1% /dev

tmpfs 972M 0 972M 0% /dev/shm

+++++++++++++++++++++++++++++++++++++++

二. 场景二:内核模块Bug

在文件系统处理文件需要的信息都存放在索引节点(inode)中,如果在删除文件的时候索引节点的引用计数不为0(表示文件正在被使用),则不会在磁盘中真正的删除文件,从而保证正在使用此文件的进程能够正常的处理文件。

首先我们一起来看一下内核中关于文件系统的一些关键数据结构的关联,当一个进程打开一个文件后,便会在内核中创建一个file对象,这个对象主要描述了进程如何与文件进行交互。file对象中将指向一个dentry结构(目录项),目录项中描述了目录项名称,父目录项信息,子目录项信息等。而dentry中的d_inode所指向的inode节点中则包含了实际的文件存储在磁盘上的信息。

当多个进程打开同一个文件时,内核中变会创建相应的file对象,但是他们都公用同一个dentry,只不过每一次打开文件dentry的引用计数d_count加1。并且对于打开的同一个文件而言,inode也是唯一的,inode的引用计数i_count一般为文件硬链接的数目。看过一些中文博客,说“同一个文件,每打开一次,则inode中引用计数i_count则加1”,这种说法通过我的验证结果是错误的。实验结果是:对于同一个文件,每打开一次,则inode中的引用计数不变,但相应的dentry引用计数加1.

这次客户在删除文件后,磁盘空间没有释放,通过"lsof"命令也没有找到正在占用此文件的进程。于是再次怀疑这是由于产品的内核模块早成的。后经分析得到:在上一篇博文《Linux Kernel模块内存泄露查找 (2)》中解释过由于在产品内核模块中,对dentry引用,并使用完之后并没有对其引用计数减1,从而造成内存泄露。在这种情况下,dentry不会被释放,则inode也就一直被引用着,从而也导致了即使删除文件,也不会从磁盘删除。

而且针对以上的问题和分析,如果不能及时给客户修这个问题,那也只能让其重新启动OS,空闲的磁盘空间才会释放出来。

本文分享自微信公众号 - 一个程序员的修炼之路(CoderStudyShare),作者:iceking

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2015-08-10

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux文件后删除空间未释放问题

    当系统空间使用量过大需要清理空间或者清理某个文件时,有时会出现执行了删除命令之后磁盘空间并没有释放的情况。很多人首次遇到该情况时会比较困惑,在考虑是不是像win...

    July
  • [903]linux文件删除后磁盘空间没有释放

    周小董
  • 删除文件后,磁盘空间没有释放的处理记录

    问题说明:IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件。但是发现删...

    洗尽了浮华
  • linux磁盘空间占满问题快速定位并解决

    经常会遇到这样的场景:测试环境磁盘跑满了,导致系统不能正常运行! 此时就需要查看是哪个目录或者文件占用了空间。 常使用如下几个命令进行排查:df, lsof,...

    编程随笔
  • 解决Linux删除文件后磁盘空间显示不变问题 | DevOps

    收到硬盘写满的报警消息后,随即就删除了一些无用文件,但再次查看硬盘容量时发现数值仍然未发生变化,可实际上文件已经看不到了。

    lazybios
  • Linux如何处理文件已删除但空间不释放的问题

    一个业务系统的服务器监控系统发来预警通知,磁盘空间使用率已经达到90%了,然后就登陆服务器搜索了下比较大的日志文件,全部都删除了(坑在此处埋上了),磁盘空间释放...

    砸漏
  • 记一次Linux下文件删除但空间不释放问题的解决

    用户1456517
  • Ubuntu系统和隐私清理工具汇总

    版权声明:本文为zhangrelay原创文章,有错请轻拍,转载请注明,谢谢... https://blog.csdn.net/ZhangRelay/ar...

    zhangrelay
  • 从 lsof 开始,深入理解 Linux 虚拟文件系统!

    作者:cyningsun 链接:https://juejin.im/post/6875110082724659213

    杰哥的IT之旅
  • 操作篇:Linux磁盘空间释放解决步骤

    IDC里的一台服务器的/分区使用率爆满了!已达到100%!经查看发现有个文件过大(80G),于是在跟有关同事确认后rm -f果断删除该文件。但是发现删除该文件后...

    小小科
  • 6 个 Linux 运维典型问题,大牛的分析解决思路在这里

    作为一名合格的 Linux 运维工程师,一定要有一套清晰、明确的解决故障思路,当问题出现时,才能迅速定位、解决问题,这里给出一个处理问题的一般思路:

    马哥linux运维
  • 真棒!3 种方法限制 Pod 磁盘容量,瞬间豁然开朗

    容器在运行期间会产生临时文件、日志。如果没有任何配额机制,则某些容器可能很快将磁盘写满,影响宿主机内核和所有应用。

    米开朗基杨
  • 6 个 Linux 运维典型问题,大牛的分析解决思路在这里

    小小科
  • 出了Linux 故障找不到方法?看大牛简单、朴实的解决思路

    本文由马哥教育Linux云计算面授班23期学员推荐,转载自互联网,作者为Lis,Linux资深技术专家,内容略经小编改编和加工,观点跟作者无关,最后感谢作者的辛...

    小小科
  • 如何在 Linux 下快速找到被删除的文件

    日常运维过程中,我们经常需要处理磁盘空间问题,当接到告警后,第一时间会去找那些大文件,一般比如 Centos,可能大文件就是 /var/log/messages...

    PHP开发工程师
  • 后端服务(nginx部署)<status code 500>的一次排查经历

    本文介绍狼厂同事一次解决服务端接口报 http status 500错误的过程。问题不复杂,但是问题的起因在实际工作中并不多见,并且涉及多个知识点。

    后端技术探索
  • 后端服务(nginx部署)<status code 500>的一次排查经历

    本文介绍狼厂同事一次解决服务端接口报 http status 500错误的过程。问题不复杂,但是问题的起因在实际工作中并不多见,并且涉及多个知识点。

    后端技术探索
  • [047][译]zram.txt

    zram是基于内存压缩的块设备,怎么理解,假设我们申请一个1G的zram块设备,这个块设备并没有实际的物理存储区域,是用内存模拟的,当一个128MB的文件被写入...

    王小二
  • ELK学习笔记之容器filebeat占用过多/var/log目录(filebeat进程写满磁盘)

    容器平台最近发布有点问题,整个平台每日产生日志量大约在300GB ,filebeat采用sidecar的方式采集std管道内的日志;

    Jetpropelledsnake21

扫码关注云+社区

领取腾讯云代金券