Skip to content

v1.11.6

Choose a tag to compare

@github-actions github-actions released this 11 Oct 02:57
· 52 commits to main since this release

修一次生产事故:hub 被 OOM killer 反复杀掉,形成崩溃循环

现场(2026-10-11)

配好 DB-IP 地址后,hub 每 ~40 秒一轮:

启动 → 六台节点连上 → `geo: 4 of 5 databases configured` → **OOM** → 重启 → 循环
A process of this unit has been killed by the OOM killer.
Consumed 556ms CPU time, 257.8M memory peak.
restart counter is at 12

两个原因叠在一起

  1. 内存:127 MB 的压缩包整份读进内存,再在内存里解压(解压后几百 MB)——
    一次就顶穿项目自己声明的 256M 包线(install-hub.sh 写死的那条);
  2. 重启:记录"上次什么时候拉的"只存在进程内,一重启就忘 ⇒
    每次重启都重新下载 ⇒ 又 OOM ⇒ 又重启 ⇒ 死循环。

顺带解开一个困惑:为什么有的节点有质量、有的没有——
geo 在启动后 30 秒把进程打 OOM,只有在那之前抢到过一次查询的节点留下了数据。

修法

  • 下载边收边写盘(外加 512 MB 体积上限,防止 URL 指错指向巨物);
  • 解压流式落盘;校验只读尾部 128 KB;原子替换的性质不变(坏内容绝不覆盖好文件);
  • 新鲜度改看文件 mtime ⇒ 重启不再重下 ⇒ 崩溃循环不可能再发生;
  • 临时下载文件必删(三条失败路径与成功路径都删——否则会慢慢攒满磁盘)。

实测(不是推算)

峰值内存 结果
修复前(生产) 257.8 M 顶穿 256M ⇒ OOM ⇒ 崩溃循环
修复后(本地,一次 127 MB 的完整下载) 15.8 M 与文件大小脱钩

同时补上几处"沉默"

  • 挑不出可查地址时,把 ip / ipv4 / ipv6 三个值原样打出来;
  • "没配 URL" 从 debug 提到 info,并且每轮报一次家底(geo: N of M databases configured);
  • 在线质量查询有了自己的门:此前它挂在"国家那套欠账门"上,
    国家一查到那道门就永久关上 ⇒ 库下好了却从来没查过(那也是一次现场 bug)。

一个可能"什么都不做"的定时任务,必须周期性地说一句"我还在、我看到的是这样"——
否则运维看到的只是一个安静的系统,而安静既可能是正常,也可能是任务早死了。

⚠️ 升级后建议做一件事

本版把内存用量降回项目声明的 256M 之内,因此不再需要为它临时放宽上限。
若你此前加过 drop-in(例如 MemoryMax=1G),验证本版正常后请删掉它,回到默认的 256M:

rm /etc/systemd/system/monitor-hub.service.d/memory.conf
systemctl daemon-reload && systemctl restart monitor-hub
systemctl show -p MemoryPeak monitor-hub      # 期望远低于 256M

已知、尚未修(下一版)

MaxMind 与 DB-IP 目前共用同一个设置键:填 DB-IP 的 .mmdb.gz 会让 MaxMind 那两个来源
把它当 .tar.gz 解,日志里出现两条 cannot unpack 的 WARN。无害(DB-IP 照常成功),但很误导。

只有 hub 改动;agent 无需升级,也无需重新签名。