文档首页> 弹性云服务器 ECS> 故障排除> 操作系统类(Linux)> 为什么Linux云服务器df和du统计磁盘空间的大小不一致?
更新时间:2024-05-21 GMT+08:00
分享

为什么Linux云服务器df和du统计磁盘空间的大小不一致?

问题描述

Linux云服务器执行df和du命令查看磁盘使用空间的大小不一致。

如下图所示,使用df -h命令查看磁盘使用空间,比du -sh命令统计得到的要大。

可能原因

一般来说不会出现删除文件后空间不释放的情况,但是也存在例外,比如文件进程锁定,或者有进程一直在向这个文件写数据。

Linux系统中的一个文件在文件系统中存放分为两个部分:数据部分和指针部分,指针位于文件系统的meta-data中,在将数据删除后,这个指针就从meta-data中清除了,而数据部分存储在磁盘中。在将数据对应的指针从meta-data中清除后,文件数据部分占用的空间就可以被覆盖并写入新的内容,之所以出现删除文件后,空间还没有释放,就是因为进程还在一直向这个文件写入内容,导致虽然删除了文件,但是由于进程锁定,文件对应的指针部分并未从meta-data中清除,而由于指针并未删除,系统内核就认为文件并未被删除,因此通过df命令查询空间并未释放。

当一个文件被删除后,在文件系统目录中已经不可见了,所以du就不会再统计它了。然而如果此时还有运行的进程持有这个已经被删除了的文件的句柄,那么这个文件就不会真正在磁盘中被删除,分区超级块中的信息也就不会更改。这样df仍旧会统计这个被删除了的文件。

处理方法

  1. 执行以下命令,切换到/opt目录。

    cd /opt

  2. 执行以下命令,查看所有已被删除但还被进程占用的文件。

    lsof | grep deleted

    从回显结果可以看出,/var/log/docker/mongdb/log/mongdb占用190g,“deleted”状态说明这个日志文件已经被删除,但是由于进程还在一直向此文件写入数据,因此空间并未释放。

  3. 执行以下命令,清除文件。

    echo >“/var/log/docker/mongdb/log/mongdb”

    通过这种方法,磁盘空间不但可以马上释放,也可以保证进程继续向文件写入日志。

分享:

    相关文档

    相关产品