已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我负责一个聚合服务(Spring Boot 3 + JDK 21 虚拟线程 + OkHttp5 连接池 maxRequests=200/maxRequestsPerHost=50,单机 8C16G,前置 4 实例),核心接口一次请求并行扇出 5 个下游:用户中心、订单、库存、风控、推荐,每个下游有独立超时(300~800ms),整体聚合超时 1.2s。日常 P99 稳定在 120ms。
现象 最近一周出现间歇性劣化:聚合接口 P99 从 120ms 飙到 900ms+,每天 2~3 个时段,每段 5~15 分钟。关键特征:
queuedRequests 峰值从平时 0 涨到 15~30,activeRequests 稳定在 40~60(没打满 200)。Threads_running 正常。已尝试的排查与结果
queuedRequests 确实涨了,但 activeRequests 远没打满 200;且其他 4 个下游 P99 不变,说明不是全局连接池拥塞——部分成立,可能是 per-host=50 的瓶颈。期望得到的答案形态
queuedRequests 峰值、activeRequests / maxRequestsPerHost、JFR pause、下游服务端接收时间戳 vs 本服务发出时间戳的差值)在 5 分钟内给出「瓶颈在 A/B/C」的结论?有没有一个类似「决策树」或「阈值表」的可复用方法?activeRequests / maxRequestsPerHost 达到多少(0.5?0.7?0.85?)才算「连接池排队开始主导延迟」?这个比例跟「下游 P99 劣化幅度」之间有没有可量化的关系?Dispatcher 线程池(默认 64 线程)会不会成为隐性瓶颈?queuedRequests 在虚拟线程语义下还代表「排队」吗?有没有已知的坑?相关引用