java - 关于 SpringBoot Tomcat acceptCount 池
问题描述
我正在处理 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 配置为拒绝任何排队的操作?
非常感谢您提前。
此致。
解决方案
acceptCount参数的值直接传递给操作系统:例如对于 UNIX-es,它被传递给listen
. 由于传入连接总是在 JVM 接受之前放入操作系统队列中,因此低于该值的值1
没有任何意义。Tomcat 明确地忽略这些值并保持其默认值100
。
然而,Tomcat 中真正的队列是从操作系统队列中接受但由于缺少处理线程而未被处理的连接 ( maxThreads
)。您最多可能有maxConnections - maxThreads + 1
这样的联系。在您的情况下,有 81 个连接等待处理。
推荐阅读
- c# - 初始化安装时发生异常:System.BadImageFormatException:无法加载文件或程序集
- node.js - 如何在NodeJS中访问AudioContext并将正弦波写入AudioBuffer
- html - 使导航栏响应的好方法
- docker - 对使用 Docker 的容器网络隔离感到困惑
- node.js - 错误:使用 Google Drive API 创建权限时需要权限类型字段
- html - 如何使占位符字体(形式)大小在设备之间相同?
- rust - 如何在测试范围的mod中使用注解和微?
- hazelcast - hazelcast 开源成本?
- iptables - `iiptables input policy drop`变成`all forward drop`
- node.js - 如何保护 nodejs 中的套接字连接?