已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
K8s 1.28.9 + cgroup v2 + 内核 5.15,14 节点 16C64G 集群,Java 17 / Spring Boot 3 订单服务,HikariCP 4.0.3,连接池配置 maximumPoolSize=20、minimumIdle=10、connectionTimeout=3s、leakDetectionThreshold=0(没开)。后端 MySQL 8.0.36 单主,单 Pod 稳态 QPS 约 400,P99 稳定在 45ms。
近 3 周出现 4 次「连接池耗尽」告警(connectionTimeout 3s 内拿不到连接,抛 SQLTransientConnectionException),每次窗口 40–90s,期间 P99 从 45ms 涨到 800ms–2.5s,错误率 0.8%–3%。事后看监控,发现三个信号都「红过」:
DataSource.getConnection 入口计时):从 1ms 涨到 3000ms+,但涨到 100ms 时 active 占比才刚过 80%,pending 还只有 1–2active/total > 0.95 持续 5m 才告警,我 4 次事件里 active 占比在 80% 时 P99 已经涨到 200ms+,等它到 95% 再告警,留给运维的处置窗口不到 10s,基本来不及。awaitingConnections、poolFillRate、poolUsage 这些,你们线上实际接进 Prometheus 的有哪几个?哪个信噪比最好?希望有线上跑过的同学给:
我这边可以把我 4 次事件的 Prometheus 数据(脱敏)整理成时序图贴出来,作为后续讨论的参照。