原文网址:https://www.youyong.top/article/1158e5a829d7
Linux 服务器,使用 df -h 查看文件系统使用率,可以看到 /dev/xvdb1 磁盘占用了约 27G,挂载目录为 /opt。
原文网址:https://www.youyong.top/article/1158e5a829d7
Linux 服务器,使用 df -h 查看文件系统使用率,可以看到 /dev/xvdb1 磁盘占用了约 27G,挂载目录为 /opt。
原文网址:https://www.youyong.top/article/1158e5a829d7
但进入到 opt 目录中执行 du -sh ,显示空间总占用量约 2.4G,和 du 查看到的结果不一致。
问题分析:
du 命令会对统计文件逐个调用 fstat 这个系统调用,获取文件大小。它的数据是基于文件获取,可以跨多个分区操作。
du - estimate file space usage
而 df 命令使用 statfs 这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。
df - report file system disk space usage
导致这个两个命令查看磁盘容量不一致的原因是,用户删除了大量的文件被删除后,在文件系统目录中已经不可见了,所以 du 就不会再统计它。然而如果此时还有运行的进程持有这个已经被删除的文件句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改,df 仍会统计这个被删除的文件。
解决办法:
可通过 lsof 命令查询处于 deleted 状态的文件。被删除的文件在系统中被标记为deleted。如果系统有大量 deleted 状态的文件,会导致 du 和 df 统计结果不一致。
lsof |grep deleted //在opt目录下执行lsof |grep deleted
然后,通过如下方法处理:
1、根据 lsof 列出的 pid 直接 kill 相应进程或者重启对应的服务。示例:
kill -9 692
注:如果服务器正在运行业务,kill 会导致进程直接终止,可能会影响到业务,请慎重操作。
2、重启服务器验证效果:
重启服务器系统会退出现有的进程,开机后重新加载。该过程会释放调用的 deleted 文件的句柄。
作者声明:本篇文章系本人原创,欢迎分享,但未经许可,谢绝转载。
共 0 条留言