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

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

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

我们发现剩余磁盘空间比較少时,回去删除一些大的暂时文件或者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,空暇的磁盘空间才会释放出来。

Linux中删除文件,磁盘空间未释放问题追踪的更多相关文章

  1. linux 删除文件 磁盘空间未释放

    具体情况就是:删除了一个超大文件后,发现磁盘空间没有变化 原因:有进程正在使用这个文件,虽然我们从文件系统的目录结构上解除链接(unlink),然而文件是被 打开的(有一个进程正在使用),那么进程将仍 ...

  2. Linux解决删除文件后空间没有释放问题_端口占用问题

    使用命令 (1) losf | grep deleted 查询所有已经删除但是还未释放空间的进程,找到容量最大的线程,kill -9 pid 然后等待容量释放 (2) netstat -ano | g ...

  3. 【Linux命令】删除大文件后磁盘空间未释放问题

    前言 工作中经常遇到Linux系统磁盘空间不足,但是删除后较大的日志文件后,发现磁盘空间仍没有被释放,有点摸不着头脑,今天博主带大家解决这个问题. 思路 1.工作发现磁盘空间不足: 2.找到占用磁盘空 ...

  4. LINUX文件删除,但磁盘空间未释放

    最近在进行系统压测,由于服务器节点太多,便写了个简单的脚本,在执行过程中发现,日志文件删除后,磁盘空间只释放了一小部分,任有大部分磁盘空间未释放. 使用lsof | grep delete命令,发现已 ...

  5. Mysql删除数据后磁盘空间未释放的解决办法【转】

    转自 Mysql删除数据后,磁盘空间未释放的解决办法 - 今日头条(TouTiao.com)http://toutiao.com/a6303087712678412546/?tt_from=mobil ...

  6. Linux 删除文件后空间不释放【原创】

    删除MySQL备份文件后,查找文件所在目录发现文件已经备删除了,但是空间没有释放,还是83% 解决方法: lsof|grep -i delete 发现进程还在,杀掉进程 kill -9 5377 再次 ...

  7. linux中删除文件内空白行的几种方法。

    linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...

  8. 解决linux删除文件后空间没有释放问题

    linux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [ro ...

  9. Linux 删除文件后空间不释放磁盘空间

    在Linux操作系统下,有个没用的文件占用了400G,于是删除掉. [root@yoon log]# rm -rf messages [root@yoon log]# df -hFilesystem ...

随机推荐

  1. POJ 1167 The Buses 暴搜+剪枝

    思路: 先把能选的路线都预处理出来 按照能停的车的多少排个序 (剪枝1) 搜搜搜 如果当前剩的车÷当前能停车的多少+deep>=ans剪掉 (剪枝2) //By SiriusRen #inclu ...

  2. 创建一个基于ViSP的图片显示程序

    创建一个图片读取,并在windows下窗口显示的程序. #include <visp/vpDisplayD3D.h> #include <visp/vpDisplayGDI.h> ...

  3. HDU 3374 String Proble

    String Problem Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  4. 将yyyyMMdd格式的字符串转成日期DateTime格式

    1.DateTime dt= DateTime.ParseExact("20110720", "yyyyMMdd", Thread.CurrentThread. ...

  5. vector与deque的区别

    最重要的区别,是内部实现上.deque是分段存储的. 都是支持随机存取. http://www.cnblogs.com/zhuyf87/archive/2012/12/09/2809896.html ...

  6. 简单理解javascript的闭包

    看过网上关于javascript的闭包的概念和分析,看完之后都是一头雾水,完全不懂,零度我本来就对于概念性的东西很烦躁,没办法,硬着头皮翻阅了很多的资料,总算理清了一点头绪,现在分享给大家,错误之处还 ...

  7. 值得学习的html知识

    这里零度为大家推荐几个值得学习的html知识,很有用的哦! 一.打开窗口即最大化 <script language="javaScript"> <!-- Begi ...

  8. [论文笔记] CUDA Cuts: Fast Graph Cuts on the GPU

    Paper:V. Vineet, P. J. Narayanan. CUDA cuts: Fast graph cuts on the GPU. In Proc. CVPR Workshop, 200 ...

  9. 初学h5须知

    9.41.浏览器是页面的环境(类似水是鱼的环境)2.浏览器结构:title    标题,题目                           URL      网址                ...

  10. c#程序打包、机器代码生成(Ngen.exe)

    深入本机影像生成器(Ngen.exe)工具使用方法详解 先介绍一点背景知识:.Net程序在运行时会实时(JIT)编译,将.Net程序文件编译成cpu认识的汇编机器码.实时编译需要消耗额外的cpu和内存 ...