Linux 磁盘空间排查:从 df/du 到定位大文件
磁盘空间告警是最常见的线上小故障之一,处理不好却很容易酿成大问题:服务写不进日志、数据库无法提交、部署直接失败。正确顺序不是一上来就删文件,而是先确认“满在哪里”,再确认“是谁占的”,最后才决定“能不能清”。
第一步:用 df 看全局
先用 df -h 看每个挂载点的使用率,重点看根分区和业务数据分区。只看百分比还不够,还要看剩余绝对值:一块 20G 的盘剩 5% 只有 1G,而一块 2T 的盘剩 5% 还有 100G,紧迫程度完全不同。
另外别忘了 df -i。文件数用尽时,即使还有磁盘空间也无法创建新文件,这种情况在小文件特别多的缓存、会话或日志目录里并不少见。
第二步:用 du 逐层下钻
确定了紧张的挂载点,再用 du 逐层缩小范围:
du -sh /var/* | sort -hr | head -20
du -h --max-depth=1 /var/log | sort -hr | head -20
注意 du 统计的是实际占用,和 ls -l 显示的大小可能不同,稀疏文件、硬链接都会造成差异。还有一个经典坑:挂载点目录下本来就有旧文件,被新挂载遮住后 df 看不到、du 也扫不到,卸载或检查挂载前目录时才能发现。
第三步:用 find 定位大文件
目录锁定后,再找具体文件:
find /var -type f -size +500M -exec ls -lh {} \;
find /var/log -type f -mtime +30 -ls
按大小找能快速发现单个大文件,按时间找则适合清理过期日志和临时产物。两者结合,比只凭感觉翻目录可靠得多。
四类最容易误伤的对象
第一是“已删除但仍被占用”的文件。进程还持有句柄时,rm 只是删了目录项,空间不会释放,lsof | grep deleted 可以看到它们。对这类日志,直接 > 文件名 截断往往比删除更安全,重启进程后空间才会真正释放。
第二是正在增长的日志。先确认日志级别和轮转配置是否合理,再考虑清理;只删不改配置,几天后还会满。
第三是包管理缓存、构建产物和旧版本备份,清理前确认是否还能回滚。
第四是 /tmp 和应用临时目录,有些文件看似无用,却可能是正在处理任务的中间结果。
收尾:清理后要留防线
清理完再跑一次 df -h,确认使用率确实下降,并观察一段时间是否反弹。更重要的是把告警阈值提前:80% 预警、90% 介入,配合日志轮转和定期清理策略,比每次都救火要省心得多。
一句话总结排查顺序:df 定分区,du 定目录,find 定文件,确认归属后再清理。
- 点赞
- 收藏
- 关注作者
评论(0)