df和du显示不同
2024-09-07 10:48:39
一.简介
Linux服务器,使用df -h查看文件系统使用率,可以看到/dev/xvdb1磁盘占用了约27G,挂载目录为/opt。
但进入到opt目录中执行:du -sh ,显示空间总占用量约2.4G,即df 和du查看到的结果不一致。
二.原因分析
du - estimate file space usage
du命令会对统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取,可以跨多个分区操作。
df - report file system disk space usage
df命令使用statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。
导致这个两个命令查看磁盘容量不一致的原因是,用户删除了大量的文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它。
然而如果此时还有运行的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df仍会统计这个被删除的文件。
可通过 lsof命令查询处于deleted状态的文件,被删除的文件在系统中被标记为deleted。如果系统有大量deleted状态的文件,会导致du和df统计结果不一致。
lsof |grep deleted
三.解决方法
1、根据lsof列出的pid直接kill相应进程或者重启对应的服务。
示例:
kill -9 692
注:如果服务器正在运行业务,kill 会导致进程直接终止,可能会影响到业务,请慎重操作。
2、重启服务器。
重启服务器系统会退出现有的进程,开机后重新加载。该过程会释放调用的deleted文件的句柄。
最新文章
- des (C语言)
- QRCode二维码生成
- Nginx 切片模块、断点续传
- 二:shell之bash变量
- Effective Objective-C 2.0 — 第四条:多用类型常量,少用#define预处理指令
- 洛谷P3371 【模板】单源最短路径
- iOS单例模式
- Java基础之写文件——使用Formatter对象加载缓冲区(UsingAFormatter)
- linux 下安装apache 快速教程
- bindService和startService的区别
- 读取spring配置文件的方法(spring读取资源文件)
- java--对象比较器
- BASH Shell 简易进度条小函数
- linux-ubuntu下fastQC的安装
- [转]为什么大型网站前端使用 PHP 后台逻辑用 Java?
- Linux磁盘使用过载
- Angular记录(10)
- EmbeddedSolrServer的使用与solor6.3.0的使用
- POI 生成、导出Excel(包含多个sheet)带 图片
- C# Note29: Close()和Dispose()的区别
热门文章
- jenkins-发送allure邮件测试报告
- 【拥抱元宇宙】创建你的第一个Unity程序HelloWorld,并发布
- 让Qt给你报时,为你读诗词 之 Qt5 TTS
- [cf1361E]James and the Chase
- [bzoj1046]上升序列
- 洛谷 P5331 - [SNOI2019]通信(CDQ 分治优化建图+费用流)
- DTOJ 1561: 草堆摆放
- 【k8s】使用Terraform一键部署EKS集群
- 制作nc文件(Matlab)
- Admixture的监督分群(Supervised analysis)