JavaScript is required
新闻中心
7*24 小时获取专业工程师的帮助,快速解决您的问题
关注获取即时动态
< 返回

惊!服务器磁盘又双叒叕爆满了,3分钟排查与永久解决方案

发布时间:2026-07-28 11:04:38   访问量:24

运维人的命也是命,别再让磁盘报警在凌晨3点吵醒你了。

前言:那个让人崩溃的深夜

凌晨2:47,你被一连串的报警短信炸醒。
登录服务器,执行df -h,看到/分区使用率100%
再执行touch test,系统冷冷地回了一句:No space left on device

你懵了。明明上周刚清理过日志,业务流量也没有暴涨,这凭空消失的磁盘空间到底去哪了?

别急。这不是玄学,这是一场与Linux文件系统的博弈。今天,我将带你用3分钟定位真凶,并奉上一套永久预防方案,让磁盘爆满从此成为历史。

第一步:不要被df -h骗了(排查逻辑)

df -h告诉你满了,但它不告诉你文件在哪里。

很多新手会直接执行du -sh *去根目录下挨个查,这在数据量大的服务器上可能会卡死,甚至导致负载飙升。

正确的排查流程应该是这样的:

  1. 快速定位大目录(只统计1级目录):

    du -h --max-depth=1 / | sort -hr | head -10

    这条命令只会统计根目录下第一级文件夹的大小,并排序展示最大的前10个。通常,罪魁祸首就在/var/home或者/tmp里。

  2. 循线追踪:
    比如发现/var很大,继续深入:

    du -h --max-depth=1 /var | sort -hr

第二步:找到那些“看不见”的巨人(真实案例)

有时候,du查出来的总大小,跟df显示的已用大小对不上。如果差了几十G,恭喜你,遇到了文件已删除但进程未释放的情况。

经典场景:
你删除了一个巨大的日志文件(比如/var/log/nginx/access.log),但Nginx进程还在运行,它依然持有这个文件的句柄。空间实际上并未释放

破局命令:

lsof | grep deleted | awk '{print $7}' | sort -hr | head -10

或者使用更现代的:

lsof +L1 | awk '{print $7, $1, $NF}' | sort -hr

看到输出里那些(deleted)的文件了吗? 找到它们对应的进程ID(PID),重启该服务,磁盘空间就会瞬间释放。不需要重启服务器!

第三步:深度扫描“小文件海啸”

如果磁盘空间没对上,或者du查出来确实满了,但没看到特别大的单个文件。那很可能是小文件太多,占满了inode

执行:

df -i

如果IUsed接近100%,说明你的inode耗尽了。这种情况多发生在缓存目录邮件队列Session存储目录。

统计哪个目录的小文件最多:

for i in /*; do echo $i; find $i -type f | wc -l; done | grep -v "^0$"

找出那个文件数量百万级的目录,然后设置定时任务清理过期缓存文件。

第四步:常见的“隐形杀手”盘点

根据我处理过的上千次磁盘告警,以下几个地方是最容易忽略的重灾区

  1. Docker/Containerd(容器杀手):

    • 位置:/var/lib/docker/overlay2 或 /var/lib/containerd

    • 真凶:僵尸容器、未清理的镜像、容器内产生的core dump。

    • 解药:

      docker system prune -a -f   # 清理所有未使用的镜像和容器(注意!确认没有持久化数据)
  2. Journald日志(系统日志杀手):

    • 位置:/var/log/journal

    • 真凶:Systemd疯狂记录debug级别的日志,且没有轮转限制。

    • 解药:修改/etc/systemd/journald.conf,设置 SystemMaxUse=5G,然后 systemctl restart systemd-journald

  3. Core Dump(崩溃杀手):

    • 位置:/cores 或程序运行目录

    • 真凶:程序崩溃生成的core文件,一个可能几个G。

    • 解药:限制core文件大小或关闭生成:ulimit -c 0

终极方案:先止血,再治本(预防与监控)

找到问题只是第一步,我们要的是永远不被吵醒

1. 日志轮转(Logrotate)配置优化

检查/etc/logrotate.conf,确保关键日志配置了compress(压缩)和maxsize(按大小切割)。
不要只按天轮转,如果某天流量暴增,按天轮转会直接撑爆磁盘。建议增加maxsize 500M

2. 监控告警分级

不要等到磁盘满(100%)才报警。设置3级告警

  • Warning(80%):发邮件,进入待处理清单。

  • Critical(90%):发短信/电话,立即登录查看。

  • Emergency(95%):自动执行清理脚本(比如删除7天前的tmp文件)。

3. 自动化清理脚本(懒人必备)

写一个脚本/usr/local/bin/disk_clean.sh,设置crontab每小时执行一次:

#!/bin/bash
# 清理超过7天的日志
find /var/log/ -name "*.log" -mtime +7 -exec truncate -s 0 {} \;
# 清理超过3天的tmp文件
find /tmp -type f -atime +3 -delete
# 重启释放句柄的进程(谨慎使用)
systemctl reload nginx

结语

服务器磁盘爆满,本质上是熵增的过程。只要业务在跑,日志就在增长,文件就在产生。

记住今天的三板斧:

  1. lsof | grep deleted 查幽灵文件。

  2. du -h --max-depth=1 查显形大文件。

  3. df -i 查小文件海啸。

行动号召:
现在,立刻登录你的服务器,执行一遍上述命令。看看有没有隐藏的炸弹?如果这篇文章帮你省下了半夜起床的焦虑,点赞、在看、转发给还在受苦的运维兄弟吧!