本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
本文主要介绍Linux实例使用df和du命令查看磁盘时结果不一致问题的解决方案。
问题描述
执行如下命令,查看Linux实例文件系统的使用率。
df -h
系统显示类似如下 ,查看
/dev/xvdb1
磁盘分区已占用空间为27 GB,挂载目录为/opt
。依次执行如下命令,切换到
/opt
目录,查看占用空间为2.4 GB,即df和du命令查看的结果不一致。cd /opt du -sh
问题原因
系统中可能存在大量被删除的文件(僵尸文件),且有运行的进程在使用这些文件的句柄。
du命令使用fstat系统调用,基于文件获取数据,可以跨多个分区操作,du不会统计被删除文件的信息;df命令使用statfs系统调用,直接读取分区的超级块信息,获取分区使用情况,如果运行中的进程持有被删除文件的句柄,分区超级块中的信息不会更改,df命令仍会统计被删除文件的信息,最终导致du和df命令统计结果不一致。
解决方案
您可以通过以下两种方案释放句柄,清除deleted状态的文件。
方案一:通过kill命令清除
远程连接ECS实例。
具体操作,请参见通过密码或密钥认证登录Linux实例。
依次执行如下命令,切换至
/opt
目录,查询处于deleted状态的文件。cd /opt lsof |grep deleted
参考lsof命令列出的PID,执行如下命令,使用kill命令结束相应进程。
警告如果ECS实例正在运行业务进程,kill命令会直接终止进程,请慎重操作。
kill <$PID>
说明<$PID>为lsof命令列出的PID。
方案二:通过重启服务器清除
重启服务器,系统会退出现有的进程,释放调用的deleted文件的句柄。
文档内容是否对您有帮助?