已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
【背景】 我负责一个 B 端 SaaS 的聚合服务(JDK 17,Tomcat max-threads=200,8C16G 容器),同一个 Tomcat 工作线程池里混跑两类任务:
【现象】 上线导出功能后,整体 P99 从 180ms 抖到 450ms+。但拆开看:导出接口自身 P99 只从 3s 涨到 5s(可以接受),而 IO 型接口 P99 恶化了 2.5 倍。直觉上判断是 CPU 密集任务占住了线程、挤占了 IO 请求的并发窗口,但线程池 active 数在抖动时段只有 90~130,远没到 200 上限——线程明明「没满」,为什么 IO 请求还在排队劣化?
【已尝试的排查】
ThreadMXBean 的线程状态分布:RUNNABLE 占比在抖动时段从 60% 掉到 30%——不确定这算「CPU 饥饿」还是正常的等 IO。【期望得到的答案形态】
补充:虚拟线程(JDK 21)我们评估过,但导出接口的计算段是纯 CPU 密集,虚拟线程并不会让它变快,反而 carrier 池还是 8 个,所以我认为核心问题不在并发模型,而在「同池混跑的调度公平性」。