微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

无论线程池大小如何,Spring Boot 都将并发 http 请求限制为 200

如何解决无论线程池大小如何,Spring Boot 都将并发 http 请求限制为 200

有人可以详细说明我在使用 Spring Boot 时遇到的一些奇怪问题吗?我有一个反应式 Spring MVC 控制器,例如:

private final Scheduler dvScheduler = Schedulers.newParallel("pool",1000);

@Override
@SneakyTrows
@GetMapping
public Mono<String> method(Mono<String> mono) {
    return mono
        .publishOn(dvScheduler)
        .flatMap(body -> {
            Thread.sleep(8000L);
            return Mono.just("");
        });
}

这是一个外部系统存根,用于在出现故障时测试主系统(8 秒延迟模拟外部系统的高响应时间)。 目标是在“几乎失败”的情况下(例如高响应时间)测量主系统的吞吐量。因此,当主系统使用网络客户端调用它时,存根正在休眠模拟高响应时间。

问题是无论我如何配置线程池,这个应用程序(存根)都不能处理超过 200 个并发请求。例如。使用tomcat:

  tomcat:
    threads:
      max: 1000
      min-spare: 1000
    accept-count: 1000
    max-connections: 10000

我可以运行一些分析器(或获取线程转储)并看到所有 1000 个线程都已创建,但只有 200 个线程停留在我的控制器的 Thread.sleep() 方法上。线程池中的所有其他 800 个都是空闲的。负载是使用 Soap-UI 负载测试模拟的,由于这个问题,我可以看到大约 15-20tps。

我使用的是 Spring Boot 2.3.4.RELEASE,用 Tomcat、Netty 和 Undertow 进行了测试,包括响应式和经典方法。结果总是一样 - 200 个并发请求的瓶颈。

800 个像这样的线程:

 jdk.internal.misc.Unsafe.park(boolean,long)
    java.util.concurrent.locks.LockSupport.park(java.lang.Object) (line: 194)
    java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await() (line: 2081)
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() (line: 1170)
    java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take() (line: 899)
    java.util.concurrent.ThreadPoolExecutor.getTask() (line: 1054)
    java.util.concurrent.ThreadPoolExecutor.runWorker(java.util.concurrent.ThreadPoolExecutor$Worker) (line: 1114)
    java.util.concurrent.ThreadPoolExecutor$Worker.run() (line: 628)
    java.lang.Thread.run() (line: 834)

200 个线程

java.lang.Thread.sleep(long)
java.lang.Thread.sleep(long,int) (line: 339)
my.org.controller.stub.StubController.method(Mono<String>) (line: 111)

这个想法只是为了确保存根应用程序不会限制主系统的 TPS。

是什么将 Spring Boot 应用程序的吞吐量限制为这样一个数字?该设置 = 200 在哪里?

更新:似乎是 Soap-UI 问题。切换到 JMeter 后 TPS 更高,线程忙于 I/O 操作。 我的属性中有 -Dsoapui.threadpool.max=500,但由于某种原因,该工具限制了一些东西,Soap-UI 中 0 延迟的 400 个线程导致 20tps,而 JMeter 中的 400 则相同 - 50tps。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。