• 1
  • 2
  • 3
  • 4
  • 5
Linux操作系统运维问题 首 页  »  帮助中心  »  云服务器  »  Linux操作系统运维问题
ECS Linux 服务器使用df和du查看磁盘容量不一致的分析和解决
发布日期:2015-12-18 20:12:51

  ECS Linux服务器,使用df -h查看文件系统的使用率,可看到/dev/xvdb1磁盘容量占用了约27G,挂载目录为/opt。


  但是进入到opt目录中执行:du -sh ,显示空间总占用量约2.4G,也就是说df 和du查看到的结果是不一致的。


  原因分析:

  df - report file system disk space usage

  df命令使用statfs这个系统调用,直接读取分区的超级块信息获取分区使用情况。它的数据基于分区元数据,只能针对整个分区。

  du - estimate file space usage

  du命令会对统计文件逐个调用fstat这个系统调用,获取文件大小。它的数据是基于文件获取,可跨多个分区操作。

  导致这个两个命令查看磁盘容量不一致的原因是用户删除了大量的文件,在文件系统目录中已不可见,因此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文件的句柄。