431 字
2 分钟
磁盘又满了:df 和 du 对不上的排查思路
凌晨收到磁盘告警,登上去 df -h 显示 97%,du -sh /* 从根目录一路扫下来却对不上账,所有目录加起来少了一半。这种 df 和 du 对不上的场景,八成是同一个原因。
标准排查路径
df -hdu -xh --max-depth=1 / 2>/dev/null | sort -rh | head-x 限定单文件系统,跳过挂载点,不然 du 会把别的盘也算进来。逐层往下钻,先定位到目录级。
df 和 du 对不上:找已删除文件
lsof +L1这条列出所有「文件已删除但句柄还开着」的进程。Unix 的删除语义是解链接,只要还有进程攥着文件句柄,空间就不会释放,df 统计的是这块空间,du 看不见它。
日志进程是惯犯:日志被 logrotate 挪走或被人手动 rm,进程还按老句柄继续写。解决分两步:
# 清空内容释放空间,进程无感> /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/