du 与df 统计系统磁盘不一致缘由与解决方法

事件原由:nginx

同事发现云主机磁盘系统盘满了,准备清理系统盘,便利用du 命令统计了根目录下各文件夹的大小,发现统计的各文件夹的大小总和 加起来比 df 命令查看到的系统盘所使用空间 要小不少。这里记录下解决方法tomcat

了解下df与du的工做原理:spa

du日志

du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,因此有很大的灵活性,不必定非要针对一个分区,能够跨越多个分区操做。若是针对的目录中文件不少,du速度就会很慢了。
 
df
df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用状况。它的数据是基于分区元数据的,因此只能针对整个分区。因为df直接读取超级块,因此运行速度不受文件多少影响。
 
du和df不一致状况缘由:
常见的df和du不一致状况就是文件删除的问题。当一个文件被删除后,在文件系统目录中已经不可见了,因此du就不会再统计它了。然而若是此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除, 分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。
 
解决方法:
1 lsof | grep delete --- 查看已经删除,仍被进程占用没有释放空间的文件相关信息 2 获得占用文件的进程,重启或kill该进程,释放文件。 

进行第一步操做时发现有较大的tomcat 和 nginx的访问日志被删除后但仍进程占用,进行第二步操做后系统盘空间成功释放不少,系统盘的使用率也就降下去了。code

 

其余须要注意的:blog

(1)当出现du和df差距很大的状况时,考虑是不是有删除文件未完成形成的,方法是lsof命令,而后重启或关闭相关进程便可。
(2)可使用清空文件的方式来代替删除文件,方式是:echo "" > test.log。
(3)除了rm外,有些命令会间接的删除文件,如gzip命令完成后会删除原来的文件,为了不在出现这种问题,前先确认没有进程打开该文件。进程

相关文章
相关标签/搜索