431 字
2 分钟
磁盘又满了:df 和 du 对不上的排查思路

凌晨收到磁盘告警,登上去 df -h 显示 97%,du -sh /* 从根目录一路扫下来却对不上账,所有目录加起来少了一半。这种 df 和 du 对不上的场景,八成是同一个原因。

磁盘占满的排查路径:先 du 逐层找大文件,找得到就直接清理;对不上账则走 lsof 找已删除句柄的支线

标准排查路径#

Terminal window
df -h
du -xh --max-depth=1 / 2>/dev/null | sort -rh | head

-x 限定单文件系统,跳过挂载点,不然 du 会把别的盘也算进来。逐层往下钻,先定位到目录级。

df 和 du 对不上:找已删除文件#

Terminal window
lsof +L1

这条列出所有「文件已删除但句柄还开着」的进程。Unix 的删除语义是解链接,只要还有进程攥着文件句柄,空间就不会释放,df 统计的是这块空间,du 看不见它。

日志进程是惯犯:日志被 logrotate 挪走或被人手动 rm,进程还按老句柄继续写。解决分两步:

Terminal window
# 清空内容释放空间,进程无感
> /proc/23842/fd/4
# 根治:重启或 reload 对应服务,让它重新打开文件
systemctl reload app

注意顺序:先 reload 再删文件是正解。先 rm 再以为完事,空间根本不会回来,下次告警还是它。

常见的三个藏污点#

  • /var/log/journal:journalctl --vacuum-size=200M 直接约束
  • Docker:docker system prune -a --volumes 一把梭之前,先 docker system df 看看都占在哪
  • 邮件队列和 core dump:/var/spool 和 /var/crash 值得单查

预防#

在这类机器上放一个 cron:df --output=pcent / | tail -1 超过 85 就告警。等用户喊着「磁盘满了」再登上去,排查窗口已经被挤没了。

磁盘又满了:df 和 du 对不上的排查思路
https://oliver6868686.tech/posts/disk-full-troubleshooting/
作者
Oli
发布于
2025-12-14
许可协议
CC BY-NC-SA 4.0