df与du不一致情况分析

转载 2012年02月02日 13:44:05

 df 显示的已使用磁盘占用率比du 统计出来的结果要大很多。原因,主要是由于两者计算结果的方式不同。

一、实验情况
1、创建并删除文件

创建文件前的磁盘容量情况:

引用
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  5.7G  5.5G  51% /
tmpfs                 506M     0  506M   0% /dev/shm


创建文件:

引用
# dd if=/dev/zero of=test.iso bs=1024k count=1000
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 14.3055 seconds, 73.3 MB/s


现在的磁盘情况:

引用
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  6.7G  4.6G  60% /
tmpfs                 506M     0  506M   0% /dev/shm


模拟某个进程正在使用该文件:

 # tail -f /tmp/test.iso


2、删除该文件
打开另一个终端,登陆到系统中。
查看是否有进程正在使用上面创建的文件:

引用
# lsof |grep test.iso
tail      2175      root    3r      REG        8,1 1048576000     752972 /tmp/test.iso


把该文件删掉,并确认:

引用
# rm /tmp/test.iso
rm:是否删除 一般文件 “/tmp/test.iso”? y
# ls /tmp/test.iso
ls: /tmp/test.iso: 没有那个文件或目录


查看是否还有进程在使用(注意结尾的标记):

引用
# lsof |grep test.iso
tail      2175      root    3r      REG        8,1 1048576000     752972 /tmp/test.iso (deleted)


查看磁盘使用情况:

引用
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  6.7G  4.6G  60% /
tmpfs                 506M     0  506M   0% /dev/shm
# cat /proc/diskstats |grep sda1
   8    1 sda1 54385 5184 1626626 130090 20434 635997 5251448 5345733 0 111685 5475829


可见,虽然从ls 已经无法找到该文件,但因为tail 进程仍在使用该文件,故实际上内核并没有把这文件所占用的空间释放出来(df 的结果)。

3、停止相关进程
回到第一终端,用Ctrl+C 终止tail 进程,查看结果:

引用
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  5.7G  5.5G  51% /
tmpfs                 506M     0  506M   0% /dev/shm
# cat /proc/diskstats |grep sda1
   8    1 sda1 54473 5184 1627402 130617 20453 636042 5251960 5345756 0 112226 5476379


至此,文件所占用的空间已完全释放。

二、说明
从上面的实验,可得出一些情况:

引用
1、若有进程在占用某个文件,而其他进程把这文件删掉,只会删除其在磁盘中的标记,而不会释放其占用的磁盘空间;直到所有访问该文件的进程退出为止;
2、df 是从内核中获取磁盘占用情况数据的,而du是统计当前磁盘文件大小的结果,由于磁盘标记已被删掉,因此du 不会计算上述被删除文件的空间,导致df 与 du的结果不一致。



三、解决问题
通常的解决方法有两个:
1、把占用文件的相关进程关闭
这可通过下面的命令得到这些已被删除,但未释放空间的文件和进程信息:

# lsof |grep deleted 

找到这些进程后,在安全的情况下把其关闭,空间自会马上释放。

2、以清空的方式替代删除
归根到底,产生问题的原因是,访问该文件的文件指针(句柄),在rm 动作后,因为进程仍在访问,因此,仍处在文件里面(中间或结尾处)。所以,如果用清空的方式,把文件指针重置,该文件所占用的空间也会马上释放出来。

引用
# echo > /tmp/test.iso
# df -h
文件系统              容量  已用 可用 已用% 挂载点
/dev/sda1              12G  5.7G  5.5G  51% /
tmpfs                 506M     0  506M   0% /dev/shm
# tail -f /tmp/test.iso
tail: /tmp/test.iso: file truncated


所以,对于常发生类似问题的文件,如:日志记录文件等。以改名、清空、删除的顺序操作可避免问题。

四、补充
除rm外,有些不明显的操作,也会产生类似的问题。
例如 gzip 命令,其对某个文件xxx.log进行压缩时,会产生一个新的xxx.log.gz文件,完成后,会把原来的xxx.log删除。
这时,若仍有进程在使用xxx.log文件,那么,实际上,该文件还是只会标记为deleted,其空间也不会释放,问题与上面提到的情况是相同的。所以,在编写脚本时,可先判断是否仍有进程正在使用该文件,然后再进行gzip 操作。

五 文件空洞

   文件读写时,如果先文件指针偏移很大一段,然后写入1byte;这样这个文件实际占用1byte空间,但是stat查看文件大小,或者读写时,都会发现文件很大;所有没有写内容的都返回0,且不占用空间,这样的文件叫 'sparse file',即文件空洞

    容易发生在一个进程在写一个文件,这是人工进行清空文件操作,就会产生。


df和du显示的磁盘空间使用情况不一致的原因及处理

在Linux下查看磁盘空间使用情况,最常使用的就是du和df了。然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊。 1. 如何记忆这两个命令 du-Disk Usage df-Disk...
  • smstong
  • smstong
  • 2013年03月25日 12:06
  • 12960

Linux服务器使用df和du查看磁盘大小不一致的问题和解决办法

Linux服务器,使用df -h查看文件系统使用率,可以看到/dev/xvdb1磁盘占用了约27G,挂载目录为/opt。 但进入到opt目录中执行:du -sh ,显示空间总占用量约2.4G,即...
  • lufeisan
  • lufeisan
  • 2016年11月13日 15:50
  • 969

linux下df -hT和du -sh 显示的数据非常不一致解决方法

问题背景:对系统进行压力测试,莫名导致tomcat的catalina.out被写入48G日志,导致磁盘空间被占满,此时在tomcat运行中使用rm -rf 命令删除该文件 问题描述:删除后df -h...
  • russ44
  • russ44
  • 2016年10月19日 09:58
  • 2260

Linux使用du和df命令结果不一致

Linux下面通常用du和df命令看磁盘空间的使用情况,基本语法如下: df - report file system disk space usage df [OPTION]... [FILE].....
  • vonzhoufz
  • vonzhoufz
  • 2015年03月30日 16:09
  • 2505

可能导致du与df查询结果不一致的两种场景

分两种情况考虑,第一种是有大文件删除了,但是仍然被某些进程占用;第二种是文件系统碎片太多需要整理。那么如何判定和处理呢。 示例环境: 操作系统所在根目录的lvm盘 /dev/mapper/centos...
  • computerms
  • computerms
  • 2016年03月21日 18:21
  • 934

df、du命令的使用,查看文件大小

快速使用: root@ubuntu:/home/zchx/Share# ls eclipse-cpp-juno-linux-gtk .tar.gz  lib_bin  lib-NEEDED  li...
  • luopeiyuan1990
  • luopeiyuan1990
  • 2012年10月11日 18:05
  • 1357

Linux下查看文件和文件夹大小的df和du命令联系与区别

磁盘大小超过标准时会有报警提示,这时如果掌握df和du命令是非常明智的选择。     df可以查看一级文件夹大小、使用比例、档案系统及其挂入点,但对文件却无能为力。     du可以查看文件及...
  • fengsuiyingdong
  • fengsuiyingdong
  • 2014年10月20日 13:45
  • 1591

转载:df -h与du -sh *的根本性差别

转载自 http://blog.itpub.net/26230597/viewspace-1242675 前言: 早晨磁盘报警刚清空完tomcat和nginx日志,使用的命令是类似echo...
  • yolanda_xfy
  • yolanda_xfy
  • 2015年02月13日 11:16
  • 621

linux下du和df命令的区别 ---检查文件资源是否被释放

Linux的df和du命令的区别 备注:工作中遇到如下一个bug: camera录制一段视频,从“File Manager”删除最后录制以后,发现闪存的大小没变化。df查看disk space...
  • hun_sunny
  • hun_sunny
  • 2013年01月30日 09:15
  • 1337

linux的du和df命令

      今天也有同学问我Linux下查看目录大小的命令,现在也将前阵子学习到du/df两个命令总结一下吧。前阵子测试工作中有遇到过由于磁盘空间满导致程序无法执行到情况,所以使用了df和du两个命令...
  • kmesg
  • kmesg
  • 2011年06月27日 17:36
  • 100596
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:df与du不一致情况分析
举报原因:
原因补充:

(最多只允许输入30个字)