返回首页DA系统C#IDE文件同步服务屏保 今天是: 2026-05-05    "立夏"  夏季的第一个节气,表示盛夏时节的正式开始

搜索
热搜: linux 技术
Hi~登录注册
查看: 2095|回复: 0

[转载] 【转载】linux服务器df和du命令不一致的原因和解决方案

[复制链接]
发表于 2022-3-31 18:01:17 | 显示全部楼层 |阅读模式
本帖最后由 da11 于 2022-3-31 18:05 编辑

linux服务器df和du命令不一致的原因和解决方案



问题描述:

    最近公司使用的服务器老是接到报警说磁盘使用率超过了80%,把大文件删除之后还是没有改善.通过df命令查看到磁盘的使用率确实在70%-80%之间徘徊,但是通过du -sh /* 命令分析却看不到那些大文件,并且总的磁盘容量比df查出来的要小的多.

问题分析:

    熟悉linux命令原理的同学都知道,df命令数据是直接从磁盘的superblock里面获取的,所以只有文件删除后并且真正的反馈给superblock才能把df查出的容量数据降下去.而du命令则是实实在在的计算每一个文件和文件夹占用的磁盘容量然后再反馈的.因此可能存在一种情况导致两个命令的结果数据是不一致的:我们使用rm命令删除的文件一直还被别的进程使用着,这时候superblock就不会重新计算该文件占用的磁盘大小,反而是一直认为这个文件还在使用中.所以我们的做法就是暂停进程对文件的占用,让superblock重新计算一次就好.


操作步骤:
    使用:lsof -n | grep deleted


  该命令会查出来那些占用着已经删除的文件的进程(如果查不到这个命令,需要安装一下lsof,具体方法另行百度),以下是我的服务查询结果:



由以上的结果可以很明确的看出:因为httpd进程一直占用着网站的访问日志文件(尽管已经被我删除).
接下来就是重启一下服务就好了:
service httpd restart
至此服务器磁盘报警问题解决.

另一个解决方案:还没删除但是准备删除的文件使用清空的方式代替rm,如echo > /tmp/test.log








本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册成为修仙之旅的少年~

x
 楼主| 发表于 2022-3-31 18:02:56 | 显示全部楼层
df和du的区别:

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

du:
disk usage的缩写,du命令会对统计文件逐个调用fstat系统调用,获取文件大小。它的数据是基于文件获取的,所以有很大的灵活性,不一定非要针对一个分区,可以跨越多个分区操作。如果统计的目录中文件很多,du速度就会变慢。
当一个文件被删除后,在文件系统目录中已经不见了,所以du不会再统计。然而如果此时还有运行的进程持有这个已经被删除的文件的句柄,这个文件就不会真正在磁盘中删除, 分区超级块中的信息也不会更改。这样df仍旧会统计这个被删除的文件。


回复 支持 反对

使用道具 举报

游客
回复
*滑块验证:

DA论坛飞机票来了~
快速回复 返回顶部 返回列表