记一次华为云ECS Docker容器日志占满系统盘导致No space left on device排查与log-opts轮转配
今天线上告警突然弹了报警,华为云ECS根分区使用率达到100%,导致业务服务直接报 No space left on device 异常,连常规命令补全和日志写入都受阻。
紧急登上去排查,过程如下:
1. 定位空间占用
首先执行 df -h 查看磁盘占用情况:
df -h
发现系统盘 / 使用率达到了 100%。
接着排查大文件,由于部署了较多 Docker 容器,优先怀疑是容器 stdout 日志没限制被刷爆了。执行以下命令排查 top 5 大日志文件:
du -sh /var/lib/docker/containers/*/*-json.log | sort -rh | head -n 5
果然看到某个微服务容器的 json.log 独占了几十个G,直接把系统盘塞满了。
2. 踩坑与应急释放
第一次遇到这种情况的新人容易直接执行 rm -rf 删除日志文件,但这会踩大坑!
如果容器进程还在运行且持有着该文件句柄,直接 rm 只是删除了目录项,文件句柄未释放(可以通过 lsof | grep deleted 查看到对应的 deleted 状态文件),磁盘空间根本不会释放!
正确的应急清空方式是使用 truncate 原地清空,保留文件句柄:
truncate -s 0 /var/lib/docker/containers/*/*-json.log
执行后再看 df -h,系统盘使用率瞬间降了下来,业务恢复正常。
3. 根治方案:配置 Docker 日志轮转 (log-opts)
为了避免后续再次出现容器日志无限刷爆磁盘的情况,需要修改 /etc/docker/daemon.json 全局限制每个容器日志的大小和文件数量。
完整 /etc/docker/daemon.json 配置如下:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
}
}
配置修改后,重启 Docker 服务生效:
systemctl daemon-reload
systemctl restart docker
这样每个容器的日志单文件最大 100MB,最多保留 3 个历史文件,从源头上彻底解决了容器日志暴涨导致磁盘满的问题。
- 点赞
- 收藏
- 关注作者
评论(0)