基础拾遗--【转】df与du不一致情况分析

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',即文件空洞

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

Via: http://blog.csdn.net/carolzhang8406/article/details/7228248

原文发布于微信公众号 - 马哥Linux运维(magedu-Linux)

原文发表时间:2015-08-03

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Linyb极客之路

nginx常见架构

总结 开启压缩主要是为了减少网络传输消耗,浏览器会对压缩的文件进行解压缩,这个过程要快很多。

1554
来自专栏技术博文

linux最常用的20条命令

玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因为我们只需要掌握我们最常用的命...

3444
来自专栏pangguoming

两台centos之间传送文件

最近在CentOS系统中(主机A)读数据。由于A主机只是作为数据读取,具体的Deep Learning 实验,需要在主机B( CentOS )中进行,需要将主机...

1533
来自专栏源码之家

linux下用wget命令下载整个ftp下目录及目录下所有文件和Bad port number错误的解决方法

1574
来自专栏Java帮帮-微信公众号-技术文章全总结

操作Linux这些命令够用了

操作Linux这些命令够用了 玩过Linux的人都会知道,Linux中的命令的确是非常多,但是玩过Linux的人也从来不会因为Linux的命令如此之多而烦恼,因...

4436
来自专栏Laoqi's Linux运维专列

Find命令详解整理

Find locate 搜索命令 使用: 1 #yum install -y mlocate   安装 updatedb  生...

3246
来自专栏菩提树下的杨过

ssh远程执行目标机器上的命令

一句话: ssh -t -p 端口号 用户名@远程机器IP '远程机器上的命令完整路径' 例如:   ssh -t -p 22 yangjunming@dev ...

21710
来自专栏小李刀刀的专栏

在WebKit中并行加载外部脚本译:

作者:Tony Gentilcore 原文:http://webkit.org/blog/1395/running-scripts-in-webkit/ Web...

3517
来自专栏我是攻城师

小知识之Linux系统中的最大进程数,最大文件描述,最大线程数

4244
来自专栏蓝天

快速上手,协程剖析

协程也叫微线程,英文名称为coroutine。一个进程可以有多个线程,一个线程可以有多个协程,这是协程和线程间的关系。不同的是,线程由系统调度,但协程需要...

1131

扫码关注云+社区

领取腾讯云代金券