40G系统盘莫名被撑爆:排查华为云ECS磁盘满载时发现的3个隐蔽大户

举报
yd_243285056 发表于 2026/11/01 12:32:55 2026/11/01
【摘要】 前天下午正在上班,手机突然收到告警短信,我自己搭的个人轻量API服务和博客全断了连接。急匆匆通过华为云控制台连进终端,敲任何命令都开始报No space left on device。跑了一句df -h,挂在根目录下的40G系统盘使用率结结实实显示为100%,可用空间只剩下0K。当时我的第一反应是见了鬼:这台机器就是用来跑跑个人小工具和轻量博客,数据库文件加起来才几百兆,静态资源早都剥离到对...

前天下午正在上班,手机突然收到告警短信,我自己搭的个人轻量API服务和博客全断了连接。急匆匆通过华为云控制台连进终端,敲任何命令都开始报No space left on device。跑了一句df -h,挂在根目录下的40G系统盘使用率结结实实显示为100%,可用空间只剩下0K。

当时我的第一反应是见了鬼:这台机器就是用来跑跑个人小工具和轻量博客,数据库文件加起来才几百兆,静态资源早都剥离到对象存储了,平时代码发布更新也就几十兆的体量,根本没往本地存过什么大文件。这40G的磁盘空间到底被谁悄悄吃光的?

在终端里顺着du -sh一步步排查目录,终于揪出了藏在系统深处吃光磁盘的几个罪魁祸首。趁着刚踩完坑,记录一下在低配云主机上容易被忽略的磁盘爆满隐患。

第一个隐蔽大户:Docker容器日志默认没有任何大小限制。
现在大家都习惯用Docker部署应用,图的是环境干净隔离。但我一直忽略了Docker底层的默认日志机制。
默认情况下,容器的标准输出(stdout/stderr)会被Docker默认的json-file驱动忠实记录在/var/lib/docker/containers/目录下的*-json.log文件里。关键在于,如果启动容器或者配置Docker守护进程时没有单独设置上限,这个日志文件是无限制增长的。
我顺藤摸瓜一查,一个写得不太讲究的定时任务容器,里面因为抓取数据报错,每隔几秒就往控制台打一串异常堆栈。这东西在后台默默跑了大半年,单个日志文件不知不觉长到了整整18G,占了小半个系统盘。
直接rm删日志文件有时还不起作用,因为文件句柄被容器进程占用着,空间根本释放不出来。
彻底根治的方法是在/etc/docker/daemon.json里加上全局日志滚动配置:
设置log-driver为json-file,并且把log-opts里的max-size限制为50m,max-file设为3。
这样不管是哪个容器跑起来,最多只保留3个50M的日志切片,超过自动滚动覆盖,直接在守护进程层面焊死了日志无限膨胀的可能。

第二个隐蔽大户:Systemd Journal系统日志无声滚雪球。
把Docker日志清理干净后,盘是腾出了一块,但我发现/var/log目录下依然占了好几个G。
用命令一查,全在/var/log/journal目录下。现在的Linux发行版不管是Ubuntu、Debian还是华为云默认的EulerOS,普遍都在用systemd-journald收集系统内核和服务日志。默认配置下,journald最多允许占用系统盘的10%甚至更多。
对于一台只有40G系统盘的小机器来说,10%就是4G的空间白白送给它。
很多老旧的系统崩溃日志、SSH失败探测日志常年堆在里面。
处理方式也很干脆:先敲一行journalctl --vacuum-size=200M把超过200M的历史日志立即抹掉;然后编辑/etc/systemd/journald.conf,把SystemMaxUse改成硬性的200M,重启systemd-journald服务。系统日志留最近两周的用来排障完全足够,没必要让它在小主机上霸占几G的豪宅。

第三个隐蔽大户:频繁构建和拉取镜像留下的Dangling孤儿层。
平时改完代码,我习惯直接在服务器上跑docker build或者docker pull更新应用。
很多人以为旧容器删了、新容器跑起来就没事了,实际上旧版本的无名镜像(显示为none的dangling images)以及构建过程中的临时缓存层,全部完完整整堆死在/var/lib/docker/overlay2目录里。
一个微服务镜像解压后三四百兆,发布二十次,如果不做清理,在底层就能偷偷攒下好几个G的僵尸图层。
我直接跑了一句docker system prune -a,一口气干掉了将近9个G无主的死缓存。
为了防止以后重复踩坑,我在服务器的crontab里加了一条每周日凌晨自动执行的定时命令:docker image prune -f,每次只自动清理由更新迭代产生的悬空旧镜像,既不影响正在跑的容器,又保证磁盘层不藏污纳垢。

第四个保障动作:花两分钟配个华为云免费的磁盘告警规则。
这次之所以翻车翻得这么狼狈,核心原因还是平时没有盯盘的习惯,直到磁盘百分之百被撑爆导致MySQL停机、服务挂掉才被迫上线救火。
收拾完机器后,我第一时间进了华为云的Cloud Eye(云监控)控制台。
很多人不知道,华为云针对ECS主机的基础监控指标是自带免费告警额度的。在控制台建一条告警规则:监控目标选择自己的云主机,监控指标选“磁盘利用率”,阈值设置为大于85%,通知方式勾选邮件和手机短信。
配好这条底线后,万一以后又有哪个进程发疯狂写文件,在磁盘还没彻底瘫痪前,手机上就能提前收到提醒,留足缓冲时间上去处理,不至于等到站点全挂了才抓瞎。

清理并配好防护后,这台40G的系统盘实际占用瞬间回落到了11G左右,空出了接近70%的可用空间。

在低配置云主机上折腾个人服务,磁盘就像随身带的小背包,装不下任何铺张浪费。限制容器日志尺寸、刹住系统Journal日志的滚雪球、定期清理构建残余,把这三处管道阀门拧紧,小规格的云服务器也能长久、踏实地运行下去。

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

评论(0)

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

全部回复

上滑加载中

设置昵称

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

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

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