已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我负责一个订单查询服务:Spring Boot 3.2 + JDK 21(虚拟线程,spring.threads.virtual.enabled=true)+ HikariCP 5.1 + MySQL 8.0。核心接口 QPS 约 3000,链路是「查订单主表 → 批量查订单明细 → 查用户标签(Redis)→ 聚合返回」,其中订单明细是一次 IN 查询,单请求 1~2 次 DB 往返,平均 DB 耗时 8ms。
【现象】
切到虚拟线程之前(Tomcat 线程池 200),HikariCP 配 maximumPoolSize=50,P99 稳定 45ms,一切正常。切到虚拟线程后,压测 QPS 拉到 3500 时 HikariCP 的 pending 线程数持续堆积,P99 从 45ms 飙到 600ms+,-Djdk.tracePinnedThreads=short 没打出明显 pin 栈,-XX:+EnableVirtualThreadsPinningDiagnostics 的 JFR 事件也很少。DB 侧 slow log 干净,连接数没打满(50/50 但 pending 长期 >100)。
【已尝试的排查】
synchronized 保护本地缓存 map(非热点路径),怀疑是 pin 点,改成 ReentrantLock 后现象没变;【期望得到的答案形态】
欢迎有相同迁移经验的同学分享具体参数与数据。