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,空暇的磁盘空间才会释放出来。
Linux中删除文件,磁盘空间未释放问题追踪的更多相关文章
- linux 删除文件 磁盘空间未释放
具体情况就是:删除了一个超大文件后,发现磁盘空间没有变化 原因:有进程正在使用这个文件,虽然我们从文件系统的目录结构上解除链接(unlink),然而文件是被 打开的(有一个进程正在使用),那么进程将仍 ...
- Linux解决删除文件后空间没有释放问题_端口占用问题
使用命令 (1) losf | grep deleted 查询所有已经删除但是还未释放空间的进程,找到容量最大的线程,kill -9 pid 然后等待容量释放 (2) netstat -ano | g ...
- 【Linux命令】删除大文件后磁盘空间未释放问题
前言 工作中经常遇到Linux系统磁盘空间不足,但是删除后较大的日志文件后,发现磁盘空间仍没有被释放,有点摸不着头脑,今天博主带大家解决这个问题. 思路 1.工作发现磁盘空间不足: 2.找到占用磁盘空 ...
- LINUX文件删除,但磁盘空间未释放
最近在进行系统压测,由于服务器节点太多,便写了个简单的脚本,在执行过程中发现,日志文件删除后,磁盘空间只释放了一小部分,任有大部分磁盘空间未释放. 使用lsof | grep delete命令,发现已 ...
- Mysql删除数据后磁盘空间未释放的解决办法【转】
转自 Mysql删除数据后,磁盘空间未释放的解决办法 - 今日头条(TouTiao.com)http://toutiao.com/a6303087712678412546/?tt_from=mobil ...
- Linux 删除文件后空间不释放【原创】
删除MySQL备份文件后,查找文件所在目录发现文件已经备删除了,但是空间没有释放,还是83% 解决方法: lsof|grep -i delete 发现进程还在,杀掉进程 kill -9 5377 再次 ...
- linux中删除文件内空白行的几种方法。
linux中删除文件内空白行的几种方法 有时你可能需要在 Linux 中删除某个文件中的空行.如果是的,你可以使用下面方法中的其中一个.有很多方法可以做到,但我在这里只是列举一些简单的方法. 你可能已 ...
- 解决linux删除文件后空间没有释放问题
linux删除文件后沒有释放空间 今天发现一台服务器的home空间满了,于是要清空没用的文件,当我删除文件后,发现可用空间沒有变化 os:centos4.7 现象: 发现当前磁盘空间使用情况: [ro ...
- Linux 删除文件后空间不释放磁盘空间
在Linux操作系统下,有个没用的文件占用了400G,于是删除掉. [root@yoon log]# rm -rf messages [root@yoon log]# df -hFilesystem ...
随机推荐
- BZOJ1306: [CQOI2009]match循环赛
[传送门:BZOJ1306] 简要题意: 有n个队伍,每个队伍都要和其他队伍比一场,赢了的队得3分,输了的队不得分,打平两队各得一分,给出每个队伍的得分,求出对战方案数 题解: DFS暴搜!!一眼就觉 ...
- BZOJ1189: [HNOI2007]紧急疏散evacuate(二分答案,最大流)
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一 块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是 ...
- Centos6.5 安装lamp环境
转载自:http://www.jb51.net/article/37987.htm (转载请注明出处,谢谢) 准备篇: 1.配置防火墙,开启80端口.3306端口vi /etc/sysconfig/i ...
- PHP的数组分为两种类型,一种是索引数组,一种是关联数组。有如下关联数组,我们如何获取它的第一个key和value呢?
示例:$items=array('name'=>'sjm','age'=>'26','sex' => '男','location'=>'北京'); //当然用循环然后break ...
- EditPlus,UltraEdit等编辑器列选择的方法
在使用富文本编辑器的时候,通常模式是行选择状态,由于今天想使用EditPlus列选择状态, 于是通过在网上收集的资料,总结出相关富文本编辑器的列选择的方法. EditPlus 1)菜单:编辑 -&g ...
- STL heap部分源代码分析
本文假设你已对堆排序的算法有主要的了解. 要分析stl中heap的源代码的独到之处.最好的办法就是拿普通的代码进行比較.话不多说,先看一段普通的堆排序的代码: //调整大顶堆.使得结构合理 void ...
- 操作excel脚本练习
# -*- coding: utf-8 -*- import xlrd import xlwt import sys from xlwt import * from xlrd import open_ ...
- android 图片特效处理之 光晕效果
这篇将讲到图片特效处理的图片光晕效果.跟前面一样是对像素点进行处理,本篇实现的思路可参见android图像处理系列之九--图片特效处理之二-模糊效果和android图像处理系列之十三--图片特效处理之 ...
- dreamweaver 8的替换功能
dreamweaver 8的替换功能 下面教你用dreamweaver 8的替换功能来删除这些冗余代码. 查找范围:文件夹(然后选取你需要替换的文件夹) 搜索:源代码查找:\btppabs=" ...
- Typedef和#define之间的区别
Typedef和define都可以用来给对象取一个别名,但是两者却有着很大不同. 1. 首先,二者执行时间不同 关键字typedef在编译阶段有效,由于是在编译阶段,因此typedef有类型检查的功能 ...