【问题标题】:About SpringBoot Tomcat acceptCount pool关于 Spring Boot Tomcat acceptCount 池
【发布时间】:2021-04-23 00:25:42
【问题描述】:

我正在处理 springboot 上的 Tomcat 配置。

假设我有以下配置:

server:
  tomcat:
    min-spare-threads: ${min-tomcat-threads:20}
    max-threads: ${max-tomcat-threads:20}
    accept-count: ${accept-concurrent-queue:1}
    max-connections: ${max-tomcat-connections:100}

我有一个带有此代码的简单 RestController:

    public String request(@Valid @RequestBody Info info) {
        
        log.info("Thread sleeping");
          
        Thread.sleep(8000);
        
        return "OK";

    }

然后我进行以下测试:

  1. 我每秒发送 200 个 HTTP 请求。
  2. 我检查了日志,正如预期的那样,我看到了 100 个同时执行,8 秒后我看到了最后一个(排队)。
  3. 其他处决被拒绝。

我遇到的主要问题是,如果我对客户端调用进行了超时控制(例如,5 秒),那么即使在客户端被拒绝,排队的操作也将在服务器上进行处理。 我想避免这种情况,所以我尝试了:

server:
  tomcat:
    min-spare-threads: ${min-tomcat-threads:20}
    max-threads: ${max-tomcat-threads:20}
    accept-count: ${accept-concurrent-queue:0}
    max-connections: ${max-tomcat-connections:100}

但是这个“0”被完全忽略了(我认为在这种情况下它意味着“无限”)。 所以,我的问题是: ¿ 是否可以将 Tomcat 配置为在达到最大连接数限制时不对操作进行排队? 或许 ¿ 是否可以将 Tomcat 配置为拒绝任何排队的操作?

非常感谢您。

最好的问候。

【问题讨论】:

    标签: java spring spring-boot tomcat configuration


    【解决方案1】:

    acceptCount 参数的值直接传递给操作系统:例如对于 UNIX-es,它被传递给 listen。由于传入连接总是在 JVM 接受之前放入操作系统队列中,因此低于1 的值没有意义。 Tomcat 明确忽略这些值并保留其默认值100

    然而,Tomcat 中的真正队列是那些从操作系统队列接受但由于缺少处理线程而未被处理的连接 (maxThreads)。您最多可能有maxConnections - maxThreads + 1 这样的连接。在您的情况下,有 81 个连接等待处理。

    【讨论】:

      猜你喜欢
      • 2018-05-22
      • 2018-10-09
      • 2016-05-28
      • 2019-04-10
      • 2021-04-30
      • 2016-04-12
      • 2020-07-10
      • 2017-01-22
      • 2014-01-11
      相关资源
      最近更新 更多