码迷,mamicode.com
首页 > 其他好文 > 详细

du 与df 统计系统磁盘不一致原因与解决方法

时间:2018-12-21 16:03:54      阅读:285      评论:0      收藏:0      [点我收藏+]

标签:gzip   分区   基于   元数据   span   文件删除   一个   直接   原因   

事件起因:

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

了解下df与du的工作原理:

du

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

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

 

其他需要注意的:

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

 

du 与df 统计系统磁盘不一致原因与解决方法

标签:gzip   分区   基于   元数据   span   文件删除   一个   直接   原因   

原文地址:https://www.cnblogs.com/ytc6/p/10155994.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!