已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
背景
我负责一个订单结算服务(Spring Boot 3.2 + JDK 17 + HikariCP 5.1,K8s 部署,4 副本,单副本 8C16G)。一个典型请求的处理流程是:
UPDATE orders SET status=?看起来只是「先查后写」的常规流程,但步骤 2 的下游 HTTP 调用期间,那个 MySQL 连接被白白占着——既没在读也没在写,纯粹是「持有中」。HikariCP 的 activeConnections 指标会把它算进去,但 threadsAwaitingConnection 为 0,看起来一切正常。
现象
maximumPoolSize=30,平时 active 数在 8~15,看起来余量充足。connectionTimeout 默认 30s 还没到就开始排队,P99 从 50ms 飙到 1.5s+。SHOW PROCESSLIST 里那些连接全是 Sleep 状态,它们并没有在干活,只是在「等上游把 HTTP 调用做完」。已尝试的排查与结果
maximumPoolSize 到 60:治标不治本,下游再抖一次还是打满,而且 MySQL max_connections 是和其他服务共享的(参考 id=1358 的讨论),全局预算更紧张。connectionTimeout 从 30s 缩到 2s:快速失败是快了,但业务侧报错率上升,客诉变多。leakDetectionThreshold=5000:它只在连接归还后检测「持有超 5s 未归还」,但我的场景里连接最终都归还了,只是持有时间过长,这个检测不会触发。期望得到的答案形态
activeConnections 和 threadsAwaitingConnection 之外,还有哪个指标能区分「真在干活」和「拿着连接等下游」?引用