只在周五下午发作的 Bug:一个被遗忘的僵尸实例
来源:dev.to — 2026-09-13
📋 概述
结算服务每周五下午开始零星返回 500,报错是「too many clients already」,但连接池只配了 20,而 pg_stat_activity 显示这 20 个连接全是 idle。排查依次否掉了慢查询、代码泄漏连接和外部定时任务三种假设后,真凶浮出水面:几个月前做金丝雀实验留下的一台旧实例仍按启动流程占满 20 个连接,它的健康检查里还有每几秒新建一个裸连接的 Bug,而自动伸缩策略每周回收一次进程,正好让泄漏在周一归零、周五再次累积。
🔑 核心要点
- pg_stat_activity 里 20 个连接全是 idle,Postgres 却拒绝再发第 21 个。
- 慢查询、连接泄漏、外部定时任务三个假设逐一被数据否掉。
- 真凶是几个月前的金丝雀遗留实例,它不在请求与错误指标里,因此完全隐身。
- 它的健康检查每几秒新建一个裸连接,只在进程重启时清理,而进程每周五被回收。
- 下线僵尸实例后,连接峰值从 94 降到 12,500 再没出现。
💡 金句
把 pg_stat_activity 按 application_name 和 usename 分组,而不只是看数量——我们默认这 20 个 idle 连接都是我们的,却从没核对过归属。
👍 0
👎 0
← 返回 dev.to 首页