关于springboot tomcat acceptcount池

syqv5f0l  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(304)

我正在处理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";

    }

然后我做了以下测试:
我每秒发送200个http请求。
我检查了日志,如我所料,我看到100个同时执行,8秒后我看到最后一个(排队)。
其他处决被拒绝。
我遇到的主要问题是,如果对客户机调用有超时控制(例如,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配置为拒绝任何排队的操作?
事先非常感谢。
致以最诚挚的问候。

qlfbtfca

qlfbtfca1#

acceptcount参数的值直接传递给操作系统:例如,对于unix es,它被传递给 listen . 由于传入连接总是在jvm接受它之前放入os队列中,因此值低于 1 毫无意义。tomcat显式忽略这些值并保留其默认值 100 .
但是,tomcat中真正的队列是从os队列接受的连接,但是由于缺少处理线程而没有被处理( maxThreads ). 你最多也可以 maxConnections - maxThreads + 1 这样的联系。在您的情况下,有81个连接等待处理。

相关问题