You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

混合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:

  1. 虚拟线程模式
  2. newThreadPerTaskExecutor执行器(性能与上述线程池接近,用于模拟虚拟线程的单任务单线程行为)

观察到的关键现象:

  • 虚拟线程明明仅需sleep 900ms,却在4秒后仍未被唤醒:
    虚拟线程被挂起4秒
  • 同时,新的虚拟线程仍在执行CPU密集任务:
    新虚拟线程执行CPU密集任务
  • 平台线程模式(每个任务创建新平台线程):线程几乎在900ms睡眠结束后同时完成,最大延迟约1200ms

请问出现该现象的原因是什么?我猜测这与JVM调度虚拟线程挂载/解绑平台线程的机制有关。


内容的提问来源于stack exchange,提问作者magiciansz

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 04:40:10