已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我负责一个多租户 SaaS 的数据分析查询服务:JDK 17 + Spring Boot 3 + PostgreSQL 15(单主库,16C64G)+ PgBouncer(transaction 模式,pool_size=20/租户)+ HikariCP(max=50)。共约 200 个租户共享同一个主库,服务侧没有按租户拆分连接池,所有租户走同一个 HikariCP 池。正常水位 P50 约 30ms、P99 约 200ms。
【现象】 过去两个月出现 3 次「全租户 P99 从 200ms 飙到 8s+」的事故,共性形态都是:某个大租户(日活查询量是平均的 10 倍)跑了一次大聚合(跨 3 张亿级表 join + 窗口函数),单查询耗时 30~90s。期间其他小租户的简单点查全部排队,HikariCP 池被占满,PgBouncer 侧 pending 飙到上限,最终网关 10s 超时,错误率打到 30%+。监控里能清楚看到「一个租户的 CPU 占满 80%+,其他租户的连接全部在等」。
【已尝试的排查与结果】
【期望得到的答案形态】