Linux 磁盘空间排查实战:df、du 与 ncdu 快速定位大文件
服务器磁盘满了是最常见的线上故障之一:日志写不进去、数据库拒绝写入、应用莫名其妙变慢。很多人第一反应是到处删文件,结果越删越慌。其实排查磁盘空间有一套固定套路,顺着 df、du、ncdu 三个命令走,十分钟就能锁定元凶。
第一步:df -h,看整体
先看哪个挂载点满了:
df -h
重点看 Use% 和挂载点。根分区满和数据盘满,处理方式完全不同;/tmp 满一般是临时文件堆积,/var 满多半是日志或数据库文件。顺带看一眼 inode:
df -i
如果 inode 耗尽而空间还很多,说明有海量小文件,通常是日志按行切分或缓存碎片造成的。
第二步:du 排序,定位大目录
确认挂载点后,用 du 逐层下钻:
du -sh /var/* | sort -rh | head -10
du -sh /var/log/* | sort -rh | head -10
也可以用一条命令直接找出最大的前 20 个目录:
du -ah / --exclude=/proc --exclude=/sys 2>/dev/null | sort -rh | head -20
注意 du 看的是目录汇总,配合 sort -rh 才能一眼看到大头。排查时常见的大户有三类:日志目录、数据库数据目录,以及各类备份和安装包残留。
第三步:ncdu 交互式排查
如果系统里装了 ncdu,就不用一层层敲命令了:
ncdu /
ncdu 会扫描并按大小排序,用方向键逐层展开,按 d 可以直接删除。没有 ncdu 时,也可以用 du -d 2 -h /var | sort -rh 做两层下钻,效果类似。图形化工具适合“不知道从哪下手”的场景,而 du 更适合写进巡检脚本做定期检查。
容易踩坑的“幽灵占用”
有一种情况特别容易误导人:df 显示磁盘满了,du 却算不出那么多空间。最常见的原因是文件被删除了,但进程还拿着句柄,空间没有释放:
lsof | grep deleted
看到这类进程后,重启对应服务或用 : > /var/log/xxx.log 的方式截断日志,空间会立刻释放。直接 rm 正在写入的日志文件,反而可能让空间一直不释放,这也是新手最常犯的错误。
另外两个容易被忽视的大户是 systemd 日志和容器层。journal 日志默认不封顶,可以用 journalctl --disk-usage 查看,并用 journalctl --vacuum-size=500M 清理。容器环境里 docker system df 能看到镜像、容器和构建缓存各占多少,清理前务必确认没有正在运行的构建任务。
清理之前,先想清楚三件事
第一,删之前先确认文件归属和业务影响,生产库的数据文件和正在运行的服务日志不能直接删;第二,能截断就不删除,能归档就不丢弃,重要日志先压缩备份再清理;第三,清理后立刻复查 df -h,确认空间确实释放,避免“删了文件空间却没回来”的尴尬。
预防比救火更重要
建议把磁盘使用率纳入日常告警,80% 预警、90% 紧急处理。对日志目录做好 logrotate 轮转,限制单文件大小和保留份数;对备份任务加 retention 策略,避免备份越攒越多;定期跑一次磁盘巡检脚本,把最大的十个目录输出到巡检报告里。很多磁盘告警不是突然发生的,而是每天涨一点、没人看导致的。
小结
磁盘排查记住一个顺序:先 df 定范围,再 du 找大头,有条件上 ncdu 交互定位;遇到 df 和 du 对不上账就查 deleted 句柄。清理时先截断日志、清理缓存类数据,再动业务文件。把这套流程写成巡检脚本或检查清单,下次磁盘报警时,你就不用再凭感觉删文件了。
- 点赞
- 收藏
- 关注作者
评论(0)