Linux实例使用df和du命令查看磁盘时结果不一致

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

本文主要介绍Linux实例使用df和du命令查看磁盘时结果不一致问题的解决方案。

问题描述

  1. 执行如下命令,查看Linux实例文件系统的使用率。

    df -h

    系统显示类似如下 ,查看/dev/xvdb1磁盘分区已占用空间为27 GB,挂载目录为/optp519333

  2. 依次执行如下命令,切换到/opt目录,查看占用空间为2.4 GB,即df和du命令查看的结果不一致。

    cd /opt
    du -sh

问题原因

系统中可能存在大量被删除的文件(僵尸文件),且有运行的进程在使用这些文件的句柄。

du命令使用fstat系统调用,基于文件获取数据,可以跨多个分区操作,du不会统计被删除文件的信息;df命令使用statfs系统调用,直接读取分区的超级块信息,获取分区使用情况,如果运行中的进程持有被删除文件的句柄,分区超级块中的信息不会更改,df命令仍会统计被删除文件的信息,最终导致du和df命令统计结果不一致。

解决方案

您可以通过以下两种方案释放句柄,清除deleted状态的文件。

方案一:通过kill命令清除

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 依次执行如下命令,切换至/opt目录,查询处于deleted状态的文件。

    cd /opt
    lsof |grep deleted
  3. 参考lsof命令列出的PID,执行如下命令,使用kill命令结束相应进程。

    警告

    如果ECS实例正在运行业务进程,kill命令会直接终止进程,请慎重操作。

    kill <$PID>
    说明

    <$PID>为lsof命令列出的PID。

方案二:通过重启服务器清除

重启服务器,系统会退出现有的进程,释放调用的deleted文件的句柄。