Skip to content

linux 系统磁盘du df 存在差异

背景

今天因为一个服务无法启动,让同事看一下,结果反馈说是磁盘空间已满,但是删除一些文件之后发现du -sh / df -h结果结果相差较大。

du -sh /

[root@node1 ~]# du -sh /
du: 无法访问"/proc/24444/task/24444/fd/4": 没有那个文件或目录
du: 无法访问"/proc/24444/task/24444/fdinfo/4": 没有那个文件或目录
du: 无法访问"/proc/24444/fd/4": 没有那个文件或目录
du: 无法访问"/proc/24444/fdinfo/4": 没有那个文件或目录
14G /

df -h

[root@node1 ~]# df -h
文件系统                 容量  已用  可用 已用% 挂载点
/dev/mapper/centos-root  146G  115G  31G   78% /
devtmpfs                 7.8G     0  7.8G    0% /dev
tmpfs                    7.8G     0  7.8G    0% /dev/shm
tmpfs                    7.8G   65M  7.7G    1% /run
tmpfs                    7.8G     0  7.8G    0% /sys/fs/cgroup
/dev/sda1                509M  138M  371M   28% /boot
tmpfs                    1.6G     0  1.6G    0% /run/user/0

寻找问题

经过一番资料查询之后,是因为dfdu统计方式的本质区别。

du统计的原理

  1. 如果统计目录下挂载了其他文件系统,那么也会对这个文件系统进行统计。
  2. 如果文件被删除,即使被其他进程引用了,du命令也无法对其统计。因为stat命令找不到这个文件。
  3. 可以跨分区统计某些你想统计的文件大小总和。因为它们都能被stat找到并统计。

df统计的原理

  1. 当某个文件系统下挂载了其他分区,df不会把这个分区也统计进去。
  2. 由于df每次统计都是读取superblock,所以df对文件系统中的某个文件进行统计时,会自动转为统计这个文件系统的信息。
  3. df会统计已删除但却仍有进程引用的文件。

对应的解决方法

通过命令查找到删除文件的引用进程。lsof | grep delete然后通过kill命令强制杀掉进程,然后重启即可。

然而

通过上诉的解决办法,估计有的朋友已经解决了问题,然而实际情况是:没有任何变化,问题依旧存在

继续寻找问题

通过上面所说的统计方式,猜测是因为文件在删除之后仅仅是对元信息做对应的标识,但是对应的存储块并未被正确的回收,而对于元信息等操作,也不敢随意的进行操作,经过一番资料查询之后,想到一个方式,就是进行磁盘碎片整理,这个过程中必然涉及到数据块的移动,自然也会重新整理对应的元信息,这样统计的数值将会一致。

解决步骤

  1. 查询对应的文件格式

    [root@node1 ~]# df -hT
    文件系统                类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root xfs       146G   115G 31G   78% /
    devtmpfs                devtmpfs  7.8G     0  7.8G    0% /dev
    tmpfs                   tmpfs     7.8G     0  7.8G    0% /dev/shm
    tmpfs                   tmpfs     7.8G   65M  7.7G    1% /run
    tmpfs                   tmpfs     7.8G     0  7.8G    0% /sys/fs/cgroup
    /dev/sda1               xfs       509M  138M  371M   28% /boot
    tmpfs                   tmpfs     1.6G     0  1.6G    0% /run/user/0

    由于系统格式为:xfs, 与之对应的命令为 xfs_fsr

  2. 寻找对应的磁盘整理命令

    [root@node1 /]# xfs_fsr
    xfs_fsr -m /proc/mounts -t 7200 -f /var/tmp/.fsrlast_xfs ...
    / start inode=0
    XFS_IOC_SWAPEXT failed: ino=2049842: 无效的参数
    XFS_IOC_SWAPEXT failed: ino=21294309: 无效的参数
    XFS_IOC_SWAPEXT failed: ino=139821787: 无效的参数
    XFS_IOC_SWAPEXT failed: ino=269848148: 无效的参数
    /boot start inode=0
    Completed all 10 passes
  3. 确认问题是否解决

    [root@node1 ~]# df -hT
    文件系统                类型      容量  已用  可用 已用% 挂载点
    /dev/mapper/centos-root xfs       146G   14G  133G   10% /
    devtmpfs                devtmpfs  7.8G     0  7.8G    0% /dev
    tmpfs                   tmpfs     7.8G     0  7.8G    0% /dev/shm
    tmpfs                   tmpfs     7.8G   65M  7.7G    1% /run
    tmpfs                   tmpfs     7.8G     0  7.8G    0% /sys/fs/cgroup
    /dev/sda1               xfs       509M  138M  371M   28% /boot
    tmpfs                   tmpfs     1.6G     0  1.6G    0% /run/user/
发表评论

电子邮件地址不会被公开。 必填项已用*标注