同一目录使用 `df` 和 `du` 命令查看的磁盘占用情况不一致

文章讨论了在排查软件应用卡顿时,df和du两个命令查看磁盘空间结果不一致的现象,原因在于df基于文件系统元数据而非实时计算,而du则直接读取文件内容。解决办法是通过lsof找出占用空间的已删除文件并关闭相关进程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在排查软件应用卡顿时,通常会检查服务器的磁盘使用情况。然而有些时候,使用 dfdu 查到的情况不一致。

例如,分别使用 df -h /du -h / 查看 / 的磁盘大小。结果可能差异如下:

df -h / 查看结果为197G

root@xzbd:~# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       217G  197G  8.3G  97% /

du -h / --max-depth=1 查看结果为 34G

root@ceph03:~# du -h / --max-depth=1
4.0K    /lib64
791M    /home
...
4.0K    /srv
17M     /etc
32K     /mnt
34G     /

通过案列,发现两者差距甚大。

分析

导致两者数据不一致,通常有两种情况。

一种是,两次查询之间有数据写入或清除操作。这种情况下一般数据变化比较小。很显然,此处并不是。

另一种情况是dfdu 统计原理不一致,导致数据有偏差。

dfdu 命令的差异如下:

特点du命令df 命令
功能估算文件和目录的磁盘空间使用情况显示文件系统的磁盘空间使用情况
范围递归计算指定目录下所有文件和子目录的磁盘空间使用情况显示已挂载文件系统的磁盘空间使用情况
输出信息文件和目录的磁盘空间使用量文件系统的磁盘空间使用情况,包括总容量、已使用、可用和挂载点等信息
查找大文件
用途定位存储占用问题,查找占用空间较大的文件或目录查看整个文件系统的使用情况和可用空间
高级选项提供一些高级选项,如--exclude用于排除指定的文件或目录,--max-depth用于限制递归深度等提供一些高级选项,如-i用于显示inode的使用情况,-T用于显示文件系统类型等

导致这两个命令查看磁盘容量不一致的原因,很大程度是因为用户删除了大量的文件,而这些文件被进程或应用程序占用而仍然处于打开状态。在Linux系统中,当一个文件被打开并被进程使用时,即使你删除了该文件,它在磁盘上的存储空间并不会立即释放,直到所有引用该文件的进程关闭该文件时才会真正释放空间。

df 命令通过读取文件系统的元数据信息来获取磁盘使用情况,而不是实时计算文件的占用空间。因此,即使你删除了文件,df 命令仍然显示文件系统占用的空间没有发生变化,直到相应的进程关闭了文件并释放了相关的存储空间。

当使用du命令查看文件和目录的磁盘空间使用情况时,它会遍历指定的文件和目录,并累加它们的大小来计算总的磁盘空间使用量。du命令在计算磁盘空间时不依赖于文件的打开状态或文件系统的元数据,而是通过读取文件的内容来确定其大小。

总结起来,du命令之所以能够准确地查出文件和目录的磁盘空间使用情况,是因为它直接读取文件的内容并计算大小,不受文件打开状态或文件系统元数据的影响。这使得du命令成为了一个可靠的工具,用于查看特定文件或目录的磁盘空间使用情况。

解决

对于已删除,但未释放空间的文件,可以使用 lsof 查找。具体命令如下:

sudo lsof | grep deleted

根据 lsof 列出的pid直接kill相应进程或重启相应的服务即可。

验证

root@xzbd:~# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       217G  197G  8.2G  97% /
root@xzbd:~# lsof | grep deleted
none       4639                   root  txt       REG                0,1         8632     163554 / (deleted)
rsyslogd  19953                 syslog    7w      REG                8,3 180902886402    2621453 /var/log/syslog (deleted)
in:imuxso 19953 19966           syslog    7w      REG                8,3 180902879272    2621453 /var/log/syslog (deleted)
in:imklog 19953 19967           syslog    7w      REG                8,3 180902880842    2621453 /var/log/syslog (deleted)
rs:main   19953 19968           syslog    7w      REG                8,3 180902882830    2621453 /var/log/syslog (deleted)
root@xybd:~# kill -9 19966 19967 19968
root@xzbd:~#
root@xybd:~# df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       217G   31G  175G  16% /

总结

查询结果不一致的原因,通常是因为这些文件被进程或应用程序占用而仍然处于打开状态。在Linux系统中,当一个文件被打开并被进程使用时,即使你删除了该文件,它在磁盘上的存储空间并不会立即释放,直到所有引用该文件的进程关闭该文件时才会真正释放空间。

df命令通过读取文件系统的元数据信息来获取磁盘使用情况,而不是实时计算文件的占用空间。因此,即使你删除了文件,df命令仍然显示文件系统占用的空间没有发生变化,直到相应的进程关闭了文件并释放了相关的存储空间。

du命令查看文件和目录的磁盘空间使用情况时,会遍历指定的文件和目录,并累加它们的大小来计算总的磁盘空间使用量。du命令在计算磁盘空间时不依赖于文件的打开状态或文件系统的元数据,而是通过读取文件的内容来确定其大小。du命令的实时性使得它可以准确地反映文件和目录的当前磁盘空间使用情况。

需要注意的是,du命令只报告指定文件或目录的磁盘空间使用量,并不包括整个文件系统的使用情况。如果想要查看整个文件系统的使用情况,可以使用df命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值