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

在Linux下查看磁盘空间使用情况,最常使用的就是du和df了。然而两者还是有很大区别的,有时候其输出结果甚至非常悬殊。

1. 如何记忆这两个命令

du-Disk Usage

df-Disk Free

2. df 和du 的工作原理

2.1 du的工作原理

du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。

2.2 df的工作原理

df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。

3 du和df不一致情况模拟

常见的df和du不一致情况就是文件删除的问题。当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

(1)当前分区sda1的使用情况

[plain] view plaincopy

  1. [[email protected] testdu]# df -h /dev/sda1
  2. 文件系统          容量  已用  可用 已用%% 挂载点
  3. /dev/sda1              49G  776M   45G   2% /var

(2)新建一个1GB的大文件

[plain] view plaincopy

  1. [[email protected] var]# dd if=/dev/zero of=myfile.iso bs=1024k count=1000
  2. 记录了1000+0 的读入
  3. 记录了1000+0 的写出
  4. 1048576000字节(1.0 GB)已复制,24.0954 秒,43.5 MB/秒

(3)此时的分区sda1使用情况

df结果:

[plain] view plaincopy

  1. [[email protected] var]# df -h /dev/sda1
  2. 文件系统<span style="white-space:pre">  </span>      容量  已用  可用 已用%% 挂载点
  3. /dev/sda1              49G  1.8G   44G   4% /var

du结果:

[plain] view plaincopy

  1. [[email protected] var]# du -sh /var/
  2. 1.6G    /var/

此时两者结果基本相同。

(4)模拟一个进程打开这个大文件,然后删除这个大文件

[plain] view plaincopy

  1. [[email protected] var]# tail -f myfile.iso &
  2. [1] 23277
  3. [[email protected] var]# rm -f myfile.iso

(5)此时,再对比du和df的结果

首先确认有进程持有myfile.iso句柄。

[plain] view plaincopy

  1. [[email protected] var]# lsof | grep myfile.iso
  2. tail      23955      root    3r      REG                8,1 1048576000       7999 /var/myfile.iso (deleted)

[plain] view plaincopy

  1. [[email protected] var]# du -sh /var/
  2. 596M    /var/
  3. [[email protected] var]# df -h /dev/sda1
  4. 文件系统          容量  已用  可用 已用%% 挂载点
  5. /dev/sda1              49G  1.8G   44G   4% /var

可以看出,df结果没有变化,而du则不再统计被删除了的文件myfile.iso。

(6)停止模拟进程,再对比du和df结果

首先确认没有进程持有myfile.iso句柄。

[plain] view plaincopy

  1. [[email protected] var]# lsof | grep myfile.iso
  2. [[email protected] var]#

[plain] view plaincopy

  1. [[email protected] var]# du -sh /var/; df -h /dev/sda1
  2. 596M    /var/
  3. 文件系统          容量  已用  可用 已用%% 挂载点
  4. /dev/sda1              49G  776M   45G   2% /var

此时,myfile.iso已经没有进程占有它了,也就从磁盘上删除了,分区的超级块信息已经更改,df也就显示正常了。

4 工作中需要注意的地方

(1)当出现du和df差距很大的情况时,考虑是否是有删除文件未完成造成的,方法是lsof命令,然后停止相关进程即可。

(2)可以使用清空文件的方式来代替删除文件,方式是:echo > myfile.iso。

(3)对于经常发生删除问题的日志文件,以改名、清空、删除的顺序操作。

(4)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了避免删除问题,压缩前先确认没有进程打开该文件。

时间: 2024-10-11 04:55:43

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

df 和du 命令统计磁盘空间不准确

Linux & Unix 中 df 和 du 命令统计磁盘空间数值不一致 经常会使用 df 和 du 分别查看磁盘空闲空间和占用空间,偶尔会发现 df(空闲空间) 会小于磁盘大小减去 du(占用空间). 两个命令实现目的是一样的,但是实现的过程有着本质的区别.就像两个人是到同一个地方,但走不同的路,所以路程的长短也就不同. df 命令的全称是 Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数.它是通过硬盘分配图进行计算出的. du 命令的全称是 Disk Used ,它

linux中 df 和 du 命令统计磁盘空间数值不一致

经常会使用 df 和 du 分别查看磁盘空闲空间和占用空间,偶尔会发现 df(空闲空间) 会小于磁盘大小减去 du(占用空间).    两个命令实现目的是一样的,但是实现的过程有着本质的区别.就像两个人是到同一个地方,但走不同的路,所以路程的长短也就不同.    df 命令的全称是 Disk Free ,显而易见它是统计磁盘中空闲的空间,也即空闲的磁盘块数.它是通过硬盘分配图进行计算出的.    du 命令的全称是 Disk Used ,它是统计磁盘有已经使用的空间.它是直接统计各各目录的大小,

du 估算文件磁盘空间使用情况

du 用于估算文件磁盘空间使用情况 常用选项: h 易读格式显示( K M G b 单位 bytes 显示 k 单位 KB 显示 m 单位 MB 显示 s 只显示总大小 max depth=< 目录层数 >>,超过层数的目录忽略 exclude=file 排除文件或目录 time 显示大小和创建时间 示例: 查看目录大小: # du -sh /opt 排除目录某个文件: # du -sh --exclude=test /opt 原文地址:https://www.cnblogs.com/W

3周第4次课 df、du命令 fdisk磁盘分区

一.df命令 作用:查看文件系统磁盘空间使用情况.可以不加任何参数,默认按 k 为单位显示 . [[email protected] ~]# df     (不带任何参数显示的单位为 KB) 文件系统中包含tmpfs 表示是临时文件系统,系统重启时,其挂载点的数据会清空.其中挂载点是/dev /shm是内存,大小是物理内存的一半. 关注"已用"超过80%就要特别注意了 swap 大小需要使用"free"命令查看,单位 KB df 常用选项有 -i.-h.-k.-m

Linux 指令详解 df 检查文件系统的磁盘空间使用情况

指令:df 检查文件系统的磁盘空间使用情况 可以查看所有已挂载磁盘的总容量.使用空间.剩余空间.挂载位置等 语法:# df [OPTION] [FILE] FILE是一个或多个路径名的可选列表,如选择这项则显示文件所在的文件系统的磁盘使用情况 Ps: 1:所有用户均有使用df命令的权限 2:默认情况下以1KB为单位显示磁盘空间 3:默认显示当前所有被挂载的文件系统的可用空间 4:超级权限用户使用df命令时会发现某个分区的容量会超过100%,原因如下: Linux系统为超级用户保留了10%的空间.

df命令--检查linux服务器的文件系统的磁盘空间占用情况

以更易读的方式显示目前磁盘空间和使用情况 语法: df [选项]... [FILE]... 文件-a, --all 包含所有的具有 0 Blocks 的文件系统 文件--block-size={SIZE} 使用 {SIZE} 大小的 Blocks 文件-h, --human-readable 使用人类可读的格式(预设值是不加这个选项的...) 文件-H, --si 很像 -h, 但是用 1000 为单位而不是用 1024 文件-i, --inodes 列出 inode 资讯,不列出已使用 blo

系统磁盘空间/dev/xvda1占满原因分析

由于项目原因需要定期检查磁盘空间占用情况,常用检查命令如下: 1.查看磁盘空间大小 df -lh 2.查看对应文件大小 du --max-depth=1 -h / 于一日发现在使用Flume + Kafka进行数据同步时,某一局点数据无法进行消费,通过df -lh查看发现系统空间满了,如下: /dev/xvda1       20G  20G  0G  100% / 然后,通过du --max-depth=1 -h / 查询对应的大文件,发现此目录下文件占用了2.3G的空间.通过各种方法找,都找

Linux:查看磁盘空间占用情况

Linux:查看磁盘空间占用情况 工作中有时被分配的测试机空间不大,经常遇到磁盘空间占满的情况.排查过程如下: 一.首先使用df -h 命令查看磁盘剩余空间,通过以下图看出/目录下的磁盘空间已经被占满. 二.进入根目录,因为最近常用的目录就是usr目录,所以用du -bs命令看一下常用的usr目录大小,由下图可见/usr目录占据了11g. 三.进入usr目录用find 命令找到大文件 然后把日志,压缩包什么的都清空: 原文地址:https://www.cnblogs.com/lizm166/p/

SQL Server--获取磁盘空间使用情况

原文:SQL Server--获取磁盘空间使用情况 对于DBA来说,监控磁盘使用情况是必要的工作,然后没有比较简单的方法能获取到磁盘空间使用率信息,下面总结下这些年攒下的脚本: 最常用的查看磁盘剩余空间,这个属于DBA入门必记的东西: -- 查看磁盘可用空间 EXEC master.dbo.xp_fixeddrives xp_fixeddrives方式有点是系统自带,可直接使用,缺点是不能查看磁盘总大小和不能查看SQL Server未使用到的磁盘信息 ======================