一、问题现象
在Linux系统的运行过程中,会经常遇到磁盘使用率过高,通过执行du与df命令查看磁盘容量确出现不一致的现象,例如以下几种现象:
-
执行du和df命令显示的结果不一致,df比du命令显示的数据大很多。
-
使用df命令显示磁盘使用率过高,但是执行du命令统计目录时却磁盘使用率不高,且查不到已删除的句柄文件。
-
当前系统存在数据盘挂载点,使用df命令查看系统盘容量已满,但是在根目录下使用du命令统计各文件总容量,但是合计达不到总容量。
二、原因分析
首先了解下du和df的工作原理:
du命令会对待统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果针对的目录中文件很多,du速度就会很慢了。
df命令使用的事statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据是基于分区元数据的,所以只能针对整个分区。由于df直接读取超级块,所以运行速度不受文件多少影响。
其次,出现du和df统计的值有较大偏差时,主要会有以下几种原因:
-
1、用户删除了大量的仍在使用的文件后,du命令不会在文件系统目录中统计这些文件。因为这个已经被删除的文件句柄不会真正在磁盘中被删除,分区超级块中的inode信息不会更改,df命令仍会统计这个被删除的文件。 此时可通过lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du和df命令统计结果不一致。
-
2、当用du -sh *命令来统计某个目录总容量时,如果该路径下包含隐藏文件,是不会包含在统计结果里的。
-
3、由于数据盘挂载前该路径下就存在文件,挂载后用du无法查询到原路径下文件大小。
三、处理建议
-
1、先通过lsof|grep delete查询目标目录下是否有被标记为已删除的文件,如有通过重启该文件所使用的进程可释放空间。(如是日志类文件,在暂时无法重启程序的情况下,也可通过进入/proc/进程ID/fd目录下,找到删除的文件,然后执行清空命令,可临时释放空间的问题。)
-
2、在目标目录下,执行du -ah命令统计结果中看是否包含较大的隐藏文件。
-
3、排除了1和2的原因检查后仍未解决问题,考虑可停业务应用,卸载数据盘后再次使用du命令查询,看是否定位到原因。
-
4、以上排除均未找到问题,建议对所有应用程序进行一个停止,观察是否有释放,从而进行进一步定位。
-
5、一时半会找不到原因的,也可通过扩容文件系统,先降低高水位情况, 再持续分析,毕竟扩容也只是治标不治本。
最后,如果觉得本文对你有帮助,欢迎点赞、收藏、评论!文章来源:https://www.toymoban.com/news/detail-594580.html
There are many things that can not be broken!文章来源地址https://www.toymoban.com/news/detail-594580.html
到了这里,关于LINUX空间管理之du与df命令查看磁盘容量不一致问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!