Linux 服务器磁盘突然占满?我按这 5 步排查和清理
服务器报警最常见的一种,就是磁盘使用率突然飙到 90% 以上。第一次遇到容易慌,其实排查路径很固定:先定位是谁在占,再决定删什么,最后补上预防措施。这篇记录我自己处理这类问题的一套流程,命令都可以直接套用。
第一步:先看整体,确认是哪块盘满了
df -h
看 Mounted on 和 Use% 两列,先确认是系统盘、数据盘还是某个单独挂载点满了。注意还有一种隐形情况:文件数(inode)耗尽,表现和磁盘满几乎一样,顺手一起查:
df -i
如果 inode 100% 但空间还剩很多,问题多半是海量小文件,排查方向完全不同。
第二步:逐层往下找大目录
du -h -x / | sort -rh | head -20
-x 的作用是只统计当前文件系统,不跨挂载点,避免把别的盘也算进来。从根目录列出最大的 20 个,再对可疑目录继续往下 du,一层层缩小范围,一般两三层就能定位到具体目录。常见的元凶就几个:/var/log 日志、/var/lib/docker 镜像和容器、某个应用自己的数据或缓存目录。
第三步:找具体的大文件
find /var -type f -size +500M -exec ls -lh {} \; 2>/dev/null
把范围限定在第二步定位到的目录里,找超过 500MB 的单个文件。日志文件异常膨胀是最常见的,比如某个服务报错后疯狂刷日志,一夜之间写出几个 GB。
第四步:清理时注意"删了空间却不释放"的坑
删日志别直接 rm 正在被进程写的文件——文件删了,但进程还握着句柄,空间不会释放,df 看还是满的。正确做法是清空内容:
> /var/log/app.log
或者用 truncate。已经 rm 掉但空间没回来的,用 lsof 找已删除仍被占用的文件:
lsof | grep deleted
重启对应服务释放句柄,空间就回来了。系统日志则用 journalctl 正规清理:
journalctl --vacuum-time=7d
只保留最近 7 天。Docker 占的空间用 docker system df 先看构成,再考虑清理无用镜像和停止的容器,数据卷别乱动。
第五步:补预防,别下个月再来一次
定位到根源后,花十分钟把复发堵上:给日志配 logrotate 并设置大小上限和保留份数;给关键目录做简单的使用率监控,80% 就告警,别等 100% 业务受影响才发现;应用日志级别在线上别长期开 debug。这三件事做完,这类报警基本就很少再见了。
总结一下:df 看全局,du 逐层定位,find 抓现行,清理时注意句柄问题,最后补上轮转和监控。磁盘满不可怕,可怕的是删错东西——动手前先看清文件属于谁、还在不在被使用,稳一点比快一点重要。
- 点赞
- 收藏
- 关注作者
评论(0)