Linux系统中df与du命令查看分区大小不一致问题分析

磁盘是Linux系统中一项非常重要的资源,对Linux磁盘管理有经验的同学们应该都知道df和du这两个命令的用途;

df:检查文件系统占用磁盘情况;

du:检查目录占用磁盘情况;

正常情况下两条命令看到的磁盘占用情况应该一致,什么情况下会出现结果不一致的情况呢?下面给大家分享在项目中遇到的问题;

设备分区满了,什么情况?赶紧看看什么原因:

先看看目录大小:

再看看文件大小,原来是log文件:

删除文件:

这下恢复了吧?

what?使用df查看/run/user/1000分区的使用率还是100%:

可使用du查看文件夹的大小明明只有28K啊:

这就要从df和du的区别说起了。

df

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

du

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

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

 

怎么办?

lsof查看被删除的文件被打开的情况:

确认进程:

杀掉进程:

df查看分区空间正常:

以上设备截图为举例,在实际的项目开发过程中,有很多日志需要处理,如系统引擎日志、nginx日志、各类开源软件日志等。对日志的大小都需要进行管理。在删除旧日志时,很可能就会遇到这个问题。

 

问题解决方法:

  1. lsof查看使用文件的进程,结束进程。
  2. 或使用清空的方式代替rm,如echo > /tmp/test.log

 

参考资料:

https://www.cnblogs.com/heyonggang/p/3644736.html

发表评论