[Eval][v2][zh] Payment service connection pool exhaustion after batch job deploy
service: payment-svccreated: 5/25/2026, 10:20:21 PM
Raw incident context
Time: 14:02 UTC. payment-svc p99 latency jumped from 120ms to 4.8s within ~3 minutes. Error rate climbed from 0.1% to 12% (mostly HTTP 500). Application logs (last 5min): repeated "FATAL: sorry, too many clients already" and "connection refused" from payment-svc → postgres-primary. Postgres metrics: - CPU: 35% (normal) - active_connections: 500 / 500 (max_connections) - waiting_queries: 87 - slow_query_log shows a new query running every 30s: SELECT * FROM ledger_entries WHERE status='pending' (no index on status; full table scan over ~12M rows, ~2.4s per execution) Deploy history: - 13:50 UTC — payment-svc v2.41 shipped. Changelog mentions "added nightly settlement batch (cron: */30 * * * *)" - No infra/DB changes in past 7 days. On-call notes (Slack): - 14:03 — CS reports failed checkout volume rising - 14:04 — Pager: PaymentSvcErrorRateHigh - 14:06 — "DB looks healthy, CPU is fine" (initial mis-diagnosis)
Summary
支付服务 payment-svc 在 14:02 UTC 出现 p99 延迟从 120ms 飙升到 4.8s,错误率从 0.1% 升至 12%,客户报告结账失败。根因是 v2.41 部署新增的定时任务(每30秒执行一次全表扫描查询)耗尽了 PostgreSQL 连接池(max_connections=500),导致新连接被拒绝。
Severity reasoning: 用户可见的结账失败(错误率 >1% 超过5分钟),且影响收入链路,符合 SEV1 标准。
deepseek-chat·prompt v2·output: zh·11741ms
Root cause hypotheses
- highpayment-svc v2.41 新增的定时任务(SELECT * FROM ledger_entries WHERE status='pending')每30秒执行一次,全表扫描12M行,每次耗时约2.4秒,占用了大量数据库连接,导致连接池耗尽。
Evidence: 慢查询日志显示该查询每30秒运行一次,无索引;active_connections 达到500上限;应用日志报 'too many clients already'。
- medium数据库连接泄漏:应用代码未正确关闭连接,导致连接数持续增长。
Evidence: 连接数稳定在500上限,未观察到持续增长趋势;但需进一步检查连接池配置。
- low突发流量导致连接数激增,但数据库 CPU 正常,排除流量突增。
Evidence: CPU 仅35%,无流量峰值迹象;错误率上升与定时任务启动时间吻合。
Investigation checklist
- 检查 payment-svc 的数据库连接池状态
kubectl exec -n prod deploy/payment-svc -- curl -s localhost:8080/actuator/metrics/hikaricp.connections.activeExpected: 确认连接数是否接近 max-pool-size(如200),若接近则说明连接池耗尽。
- 查看 PostgreSQL 当前活跃查询,确认慢查询来源
SELECT pid, query_start, state, wait_event_type, query FROM pg_stat_activity WHERE state != 'idle' ORDER BY query_start LIMIT 20;Expected: 应看到多个来自 payment-svc 的 SELECT * FROM ledger_entries WHERE status='pending' 查询,且 query_start 时间相近。
- 检查 ledger_entries 表的索引情况
\d+ ledger_entriesExpected: 确认 status 列没有索引,导致全表扫描。
- 查看 payment-svc v2.41 的部署配置,确认定时任务详情
kubectl get deploy payment-svc -o yaml | grep -A 10 'cron'Expected: 应显示 cron 表达式 */30 * * * * 和对应的命令。
- 检查应用日志中连接拒绝的具体时间戳
kubectl logs -n prod -l app=payment-svc --since=30m | grep -E 'too many clients|connection refused' | head -20Expected: 日志时间戳应与慢查询开始时间(13:50 UTC 后)一致。
Mitigation plan
立即禁用导致问题的定时任务:通过配置管理或直接删除 cron job,停止全表扫描查询。
Risk: 禁用后,夜间结算批处理功能将暂时不可用,但可手动触发。无数据丢失风险。
Rollback: 重新启用定时任务(回滚配置或重新创建 cron job)。
临时增加 PostgreSQL max_connections 到 800,并重启数据库(需评估重启影响)。
Risk: 重启数据库会导致所有连接中断,可能引发短暂不可用。增加连接数可能消耗更多内存。
Rollback: 将 max_connections 改回 500 并重启。
为 ledger_entries.status 列创建索引,以加速查询。
Risk: 创建索引期间会锁表,可能导致写入阻塞。建议在低峰期或使用 CONCURRENTLY。
Rollback: 删除索引:DROP INDEX IF EXISTS idx_ledger_entries_status;
Customer impact
部分用户无法完成结账,收到 HTTP 500 错误。受影响用户比例约12%,预计在禁用定时任务后5分钟内恢复。
Postmortem draft
Summary
支付服务 payment-svc 在 14:02 UTC 出现高延迟和错误率,根因是 v2.41 部署新增的定时任务导致数据库连接池耗尽。
Timeline (UTC)
- 13:50 — payment-svc v2.41 部署,新增定时任务
- 14:02 — p99 延迟从 120ms 升至 4.8s,错误率开始上升
- 14:03 — CS 报告结账失败
- 14:04 — Pager 触发
- 14:06 — 初步误判数据库健康
- [FILL IN] — 禁用定时任务
- [FILL IN] — 服务恢复
Impact
- 12% 的结账请求失败,持续约 [FILL IN] 分钟
- 影响用户数:约 [FILL IN]
Root Cause
payment-svc v2.41 新增的定时任务每30秒执行一次全表扫描查询,消耗大量数据库连接,导致连接池耗尽,新请求被拒绝。
Detection
PagerDuty 告警触发,CS 反馈用户问题。
Response
- 禁用定时任务
- 增加数据库连接数
- 创建索引
What Went Well
- 告警及时
- 日志清晰
What Went Poorly
- 代码审查未发现性能问题
- 初始误判数据库健康
Action Items
- [FILL IN] 添加 status 索引
- [FILL IN] 代码审查增加性能检查
- [FILL IN] 设置连接池告警
Follow-ups
- P0为 ledger_entries.status 列创建索引— 数据库管理员
- P1审查 payment-svc v2.41 的代码变更,确保定时任务有性能测试— 支付服务开发团队
- P1添加数据库连接池使用率告警(>80%)— 可观测性团队
- P2更新部署流程,要求新增定时任务必须经过性能审查— 平台工程团队
- P2在 postmortem 中补充完整时间线和影响范围— 值班 SRE
Similar past incidents
lexical match (pg_trgm)
- 81%
[Eval][v1][zh] Payment service connection pool exhaustion after batch job deploy
p99 latency 4.8s (up from 120ms), 12% 500 error rate, customers report failed checkouts
- 48%
payment-svc DB connection storm
p99 latency 4.8s, 12% 500s, checkouts failing
- 46%
[Eval][v2][en] Payment service connection pool exhaustion after batch job deploy
p99 latency 4.8s (up from 120ms), 12% 500 error rate, customers report failed checkouts
- 46%
[Scenario] Payment service connection pool exhaustion after batch job deploy
p99 latency 4.8s (up from 120ms), 12% 500 error rate, customers report failed checkouts
- 45%
[Eval][v1][en] Payment service connection pool exhaustion after batch job deploy
p99 latency 4.8s (up from 120ms), 12% 500 error rate, customers report failed checkouts