全部文档
当前文档

暂无内容

如果没有找到您期望的内容,请尝试其他搜索词

文档中心

Linux 系统中 df 与 du 命令磁盘占用统计不一致解决方法

最近更新时间:2026-08-26 11:52:24

本文介绍 dfdu 命令磁盘空间统计不一致的排查与解决方法,涵盖命令原理差异、已删除文件句柄未释放的根因分析,以及进程终止与服务器重启两种恢复方案。

问题描述

在 Linux 服务器运维过程中,通过 df -hdu -sh 命令查看磁盘空间占用时,可能出现两者统计结果不一致的情况。典型现象如下:

  • 执行 df -h 查看文件系统使用率,显示 /dev/xvdb1 分区(挂载目录为 /opt)占用约 30G。

  • 进入 /opt 目录后执行 du -sh,显示该目录下文件总占用空间仅约 14G。

两者数据存在明显差异。

可能原因

  • 命令工作原理差异:dfdu 的数据来源和统计范围不同:

    命令

    核心功能

    数据来源

    统计范围

    df

    报告文件系统整体磁盘空间使用情况

    直接读取文件系统超级块(Super Block)元数据

    仅针对整个分区(如 /dev/xvdb1),无法统计单个目录

    du

    估算文件与目录的实际磁盘空间占用

    对目标路径下每个文件逐个调用 fstat 系统调用,获取单个文件大小后累加

    可针对单个文件或目录,支持跨分区统计(需指定路径)

  • 文件删除后句柄未释放,当执行 rm 命令删除文件时,仅会从文件系统的目录结构中移除该文件的引用。若此时仍有运行中的进程持有该文件的句柄(File Handle),则文件系统不会真正删除磁盘上的文件数据,导致以下矛盾:

    • du 命令:因文件已从目录结构中消失,无法遍历到该文件,不统计其占用空间。

    • df 命令:因超级块未更新已使用空间,仍将该已删除但未释放的文件计入分区占用量。

排查步骤

通过 lsof(List Open Files)命令查询系统中所有处于 deleted 状态但仍被进程占用的文件:

lsof | grep deleted

执行后若输出大量包含 deleted 标识的文件记录(格式示例:process_name PID user fd type device size/off inode path (deleted)),则可确认是此类文件导致 dfdu 统计不一致。

解决方案

方法一:终止持有句柄的进程(推荐)

若已通过 lsof 定位到关联进程,且明确进程无核心业务影响,可通过 kill 命令终止进程,释放文件句柄。优先选择此方法,影响范围可控,无需重启服务器。

kill -9 <PID>

方法二:重启服务器

若通过 lsof 查询到大量文件句柄且无法逐一定位关联进程,可通过重启服务器彻底释放所有进程持有的文件句柄。服务器重启过程中会强制终止所有运行中的进程,开机后重新加载文件系统,所有已删除但未释放的文件句柄将被自动释放。

此方法影响范围较大,建议在业务低峰期执行,并提前确认业务可接受短暂中断。

预防建议

  • 删除大文件(尤其是被服务进程占用的日志文件、临时文件)前,先通过 lsof 命令确认是否有进程持有该文件句柄,若有则先停止关联服务再删除。

  • 可通过定时任务定期执行 lsof | grep deleted,监控系统中已删除但未释放的文件,发现异常及时处理,避免长期占用磁盘空间。

文档导读
纯净模式常规模式

纯净模式

点击可全屏预览文档内容
文档反馈