【问题标题】:Embedded Tomcat NIO thread pool - no threads added嵌入式 Tomcat NIO 线程池 - 未添加线程
【发布时间】:2022-01-23 09:38:26
【问题描述】:

我使用以下配置运行 Spring Boot 2.6.x 应用程序(与 Tomcat 9.56.x 捆绑):

server.tomcat.accept-count = 100
server.tomcat.threads.max = 1000
server.tomcat.threads.min-spare = 10

在具有 16 个 CPU 内核和 32GB 内存的机器上

我测试了我的服务器的性能负载,在此期间我打开了多个 (500) 个连接,每个连接每 1 秒发送一个 HTTP 请求。

预期行为:tomcat 将尝试使用尽可能多的线程以最大化吞吐量。

实际行为:tomcat 始终坚持使用 10 个线程(由“min-spare”配置),并且从不添加超过配置数量的线程。我知道通过观察它的 JMX 端点(currentThreadCount 总是 10)。尽管它肯定无法及时处理所有请求,因为我的客户端中有越来越多的待处理请求。

谁能解释我这样的行为? Tomcat(NIO线程池)应该根据什么来决定是否添加线程?

【问题讨论】:

    标签: spring-boot tomcat


    【解决方案1】:

    原来问题出在我的客户身上。

    为了发出请求,我使用的是内部使用 HttpClient 的 RestTemplate。嗯,HttpClient 在内部管理连接,默认情况下它配置了非常低的限制 - 最多 20 个并发连接......

    我通过配置 PoolingHttpClientConnectionManager(它应该在多线程环境中提供更好的吞吐量)和增加限制解决了这个问题:

    HttpClientBuilder clientBuilder = HttpClientBuilder.create();
    PoolingHttpClientConnectionManager connManager
                    = new PoolingHttpClientConnectionManager();
            connManager.setMaxTotal(10000);
            connManager.setDefaultMaxPerRoute(10000);
    
            clientBuilder.setConnectionManager(connManager);
    HttpClient httpClient = clientBuilder.build();
    

    这样做之后,我大大增加了每秒发出的请求数,这使得 Tomcat 添加新线程 - 正如预期的那样

    【讨论】:

      猜你喜欢
      • 2017-04-04
      • 2021-04-30
      • 2016-04-12
      • 2020-07-10
      • 2010-12-09
      • 2011-09-18
      • 1970-01-01
      • 1970-01-01
      • 2018-05-16
      相关资源
      最近更新 更多