已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我负责一个支付回调服务:Spring Boot 3.2 + JDK 21(spring.threads.virtual.enabled=true,未额外调 carrier)+ MySQL 8.0 + Redis 7 + gRPC(下游风控)。容器 8C16G(K8s cpu limit=8),入口 QPS 约 1500,单请求链路:解析回调报文(Jackson 反序列化,报文 8~15KB,平均 2.3ms,P99 8ms)→ 落 MySQL 幂等表 → 调风控 gRPC(P99 35ms)→ 写结果。
【现象】
切到虚拟线程之前(Tomcat 线程池 200),整体 P99 稳定 60ms。切虚拟线程后压测 QPS 拉到 2000:DB 与 gRPC 段 P99 确实从 12ms / 40ms 降到 6ms / 25ms(IO 段收益明显),但JSON 反序列化段 P99 从 8ms 涨到 42ms,且 async-profiler 看到的 CPU 时间反而涨了约 35%。整机 CPU 利用率只到 62%,说明不是绝对算力不够,更像是调度/上下文切换放大。-Djdk.tracePinnedThreads=short 干净,JFR 里 jdk.VirtualThreadPinned 事件 0 条。
【已尝试的排查】
-Djdk.virtualThreadScheduler.parallelism=16(2×核数):P99 没变,反而多 5% 抖动;-Xlog:safepoint 看 STW 都在 0.3ms 内,排除。【期望得到的答案形态】
欢迎有相同迁移经验的同学贴具体参数(核数、carrier、QPS、P99)与数据。