混合CPU密集与阻塞任务时虚拟线程性能劣化原因排查
虚拟线程压测异常延迟问题
测试环境:Spring Boot 3.4.0(基于JDK21),搭配嵌入式Tomcat
测试接口代码如下:
@GetMapping("/test") public void mostIOLowCPU() throws InterruptedException { long startTime = System.currentTimeMillis(); while (System.currentTimeMillis() - startTime < 100) { double x = Math.random(); // 占用CPU的随机操作 } Thread.sleep(900); }
通过JMeter进行压测:5000用户、10秒Ramp-up时间,压力约500QPS。两种配置下的结果差异巨大:
- 开启虚拟线程(配置
spring.threads.virtual.enabled=true):平均延迟约19秒 - 使用普通线程池(配置如下):平均延迟仅1.027秒(已调大参数避免线程数量瓶颈)
server: tomcat: threads: max: 10000 max-connections: 10000 accept-count: 10000
针对以下两种场景,每隔2-3秒采集一次线程dump:
- 虚拟线程模式
newThreadPerTaskExecutor执行器(性能与上述线程池接近,用于模拟虚拟线程的单任务单线程行为)
观察到的关键现象:
- 虚拟线程明明仅需sleep 900ms,却在4秒后仍未被唤醒:

- 同时,新的虚拟线程仍在执行CPU密集任务:

- 平台线程模式(每个任务创建新平台线程):线程几乎在900ms睡眠结束后同时完成,最大延迟约1200ms
请问出现该现象的原因是什么?我猜测这与JVM调度虚拟线程挂载/解绑平台线程的机制有关。
内容的提问来源于stack exchange,提问作者magiciansz
相关产品推荐
相关产品推荐

