服务器磁盘又满了?df、du、journalctl 三板斧

举报
yd_265618206 发表于 2026/10/23 09:17:28 2026/10/23
【摘要】 做后端开发,总会遇到服务器突然报警:磁盘使用率 95%。第一次遇到时我手忙脚乱,删了半天日志,空间一点没释放。后来总结出三个命令的固定排查流程,几分钟就能定位问题。这篇把这套方法写下来,给同样被磁盘报警吓过的人参考。第一板斧:df,看整体先看整台机器的磁盘使用情况:df -h-h 是以人类可读的方式显示(GB/MB)。重点看 / 根分区的使用率和挂载点。如果根分区到了 90% 以上,就要动手...

做后端开发,总会遇到服务器突然报警:磁盘使用率 95%。第一次遇到时我手忙脚乱,删了半天日志,空间一点没释放。后来总结出三个命令的固定排查流程,几分钟就能定位问题。这篇把这套方法写下来,给同样被磁盘报警吓过的人参考。

第一板斧:df,看整体

先看整台机器的磁盘使用情况:

df -h

-h 是以人类可读的方式显示(GB/MB)。重点看 / 根分区的使用率和挂载点。如果根分区到了 90% 以上,就要动手了。注意顺手看一下 tmpfs 和 overlay,这类是内存文件系统,占用的是内存不是磁盘,别被它吓到。

第二板斧:du,找大户

知道哪个分区满了,就用 du 逐层定位是谁吃掉了空间:

du -sh /var/* | sort -rh | head -10

这条命令列出 /var 下各目录的占用并按大小排序。顺着最大的目录一层层往下钻,几分钟就能找到元凶。经验之谈:嫌疑人通常是这三个——/var/log 下的系统日志、/var/lib/docker 下的容器层和日志、应用自己写的业务日志。我第一次排查,凶手就是 Docker 的 json 日志文件,一个容器攒了十几个 G。

第三板斧:journalctl,收日志

找到是日志的问题,别急着 rm -f。systemd 的日志用 journalctl 管理,先看看量有多大:

journalctl --disk-usage

如果 journal 占了几个 G,可以限制它的总大小并立刻生效:

sudo journalctl --vacuum-size=500M

这条命令会把 journal 日志压缩到 500M 以内。想一劳永逸,就去改 /etc/systemd/journald.conf,把 SystemMaxUse=500M 写进去,重启服务后长期有效。

删文件为什么空间没释放?

这是我当年踩过最深的坑:rm 删掉了日志文件,df 一看,空间一点没动。原因是文件还被某个进程占用着,Linux 要等所有打开它的进程关闭后才真正释放。用这条命令揪出它们:

lsof | grep deleted

看到被删但还占着空间的文件,要么重启对应服务,要么直接清空文件内容而不是删除文件:

: > /var/log/app/app.log

清空内容会立即释放空间,进程也不用重启。这是线上救急时最安全的一招。

顺手防一手:给 Docker 日志加个上限

既然凶手经常是 Docker 日志,不如从源头限制它。Docker 的 json-file 日志驱动默认不轮转,在 /etc/docker/daemon.json 里加上:

{
  "log-driver": "json-file",
  "log-opts": {"max-size": "50m", "max-file": "3"}
}

重启 Docker 后,每个容器的日志最多保留 3 个 50M 的文件,单个容器再也不会默默吃掉十几个 G。线上机器建议都配上,这是性价比最高的预防动作。

写在最后

磁盘满的排查其实有固定套路:df 看整体、du 找大户、journalctl 收日志,删文件前先确认没有进程占用。把这三板斧练熟,下次收到报警就不用慌了。更进一步的话,可以给日志加上 logrotate 轮转,或者把业务日志直接打到对象存储,让服务器本地只留最近几天的量,从源头上告别磁盘报警。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。