跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

如何解决因 GitLab Runner 所在 Worker 节点遭受严重内存挤压导致构建容器高频遭遇 OOM 被杀的惨剧

根本问题是宿主机内存枯竭触发OOM Killer随机终止构建容器,须立即终止内存吞噬进程、为Runner容器设置memory="1536m"和oom_score_adj=-200硬限制、配置2GB Swap并约束/dev/shm大小,再通过docker stats和日志监控Exited(137)信号。 根本问题不在 Runner 本身,而在宿主机内存已濒临枯竭,导致内核 OOM Killer 随机挑中构建容器“清理”。直接调大容器内存限制或重启 Runner 只是掩耳盗铃。必须从节点层切断挤压源头。 立即止血:确认并终止内存吞噬者 先别碰 Docker 或 GitLab,直奔宿主机: 运行 top -o %MEM 或 htop ,按内存使用率排序,一眼揪出吃掉数 GB 的 rogue 进程(常见如失控的 Python 脚本、未设限的 Java 服务、长期驻留的 Puma worker) 重点检查 git 用户下的长时进程:
ps -u git -o pid,%mem,%cpu,cmd --sort=-%mem | head -10
—— GitLab 自身的 Puma 和 Sidekiq 常年不重启就可能悄悄涨到 10GB+ 若发现异常进程, kill -9 PID 立即终止;若属 GitLab 组件,用
sudo gitlab-ctl restart puma
安全重启,释放泄漏内存 堵住漏洞:给 Runner 容器加硬性内存围栏 Runner 启动的每个构建容器都必须自带“生存上限”,否则它会和宿主机其他进程抢内存,必输: Git 程序猿必备版本控制工具 下载 修改 Runner 配置
/etc/gitlab-runner/config.toml
,在
[[runners.docker]]
区块下强制添加:
memory = "1536m"
memory_swap = "1536m"
oom_score_adj = -200
这两行作用:第一行锁死容器最多用 1.5GB 物理内存;第二行禁用 swap,避免延迟掩盖压力;第三行降低被 OOM Killer 选中的优先级 切勿留空或写
memory = "0"
,那等于交出控制权 根治隐患:为宿主机配 Swap 并约束共享内存 无 Swap 的服务器就像没安全气囊的汽车——内存一触顶,只能硬 crash: 创建 2GB Swap 文件:
sudo fallocate -l 2G /swapfile && sudo chmod 600 /swapfile && sudo mkswap /swapfile && sudo swapon /swapfile
永久生效:
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
同时检查
/dev/shm
:很多构建任务(如前端打包、Chrome Headless)会把它撑爆。进 Runner 容器执行
df -h /dev/shm
,若超 80%,启动时必须加
--shm-size=512m
参数 长效监控:让挤压苗头无所遁形 靠人工查 top 不可持续,要让系统自己报警: 启用
docker stats --no-stream gitlab-runner
持续观察 Runner 宿主容器的内存水位 在
/etc/gitlab-runner/config.toml
中开启日志级别:
log_level = "debug"
,配合
journalctl -u gitlab-runner -f
实时盯紧退出码 —— 若频繁出现
Exited (137)
,说明围栏已起效,但宿主机仍承压 部署轻量监控如 Netdata 或 Prometheus Node Exporter,对
node_memory_MemAvailable_bytes
设置低于 1.5GB 的告警

相关文章