我创建了简单的Spring Boot MVC应用程序,并注意到(使用JVisualVM
(我所有的线程都有前缀nio。这意味着Tomcat使用java.nio
包。我们可以在 Tomcat 配置中添加以下参数:maxThreads,maxConnections
.据我所知,这意味着: 例如,我们有maxThreads
= 2 ,maxConnections
= 10000,那么第一个线程的选择器(从java.nio
(可以处理10000
并发请求,但根据selectorKeys
和第二个线程的相同行为依次执行每个请求。
它是否以这种方式工作,如果是,您通常如何选择最佳选项maxConnections
提前致谢
(顺便说一句,我使用雄猫 8 (
客户端连接的最大数量为acceptCount
+maxConnections
。太低,请求可能会被不必要地拒绝。太高,如果吞吐量跟不上,客户端可能会陷入饥饿。
acceptCount:
- 默认为 100 - 这用作ServerSocket.bind
的backlog
参数。操作系统的 TCP 堆栈最多将排队等待acceptCount
套接字连接。这发生在 Tomcat 开始处理连接之前。
maxConnections:
- 默认为 10,000 - Tomcat 允许在内部进行的最大连接数。
maxThreads:
- NIO 和 NIO2 下默认为 200 - 最大并发请求处理线程数。
目标是优化服务可用性和性能,并有效利用资源。这些设置将取决于请求处理器的延迟和负载分布。
根据目标,有许多不同的容量规划方法。一个简单的选择是将maxThreads
增加到服务器无法在合理的时间段内安全地处理任何其他请求的程度。在这个饱和点,接受更多的连接是不明智的,因为清除它们需要很长时间。因此,请考虑每个处理线程需要多少 CPU 时间和 RAM,以及有多少可以同时安全运行。
我们有
maxThreads = 2, maxConnections = 10000
,那么第一个线程的选择器(来自 java.nio(可以处理 10000 个并发请求,但根据 selectorKeys 和第二个线程的相同行为依次执行每个请求。
不。它们可以依次处理 10,000 个,在本例中,每个 5,000 个。最大值是全局的,而不是每个线程的。
我想你问的问题在这里得到了回答: Tomcat - maxThreads vs maxConnections
我相信这实际上取决于您的应用程序/服务的性质。最好对系统进行压力测试并找到最佳值。由于上下文切换数量过多,IO 密集型应用程序中的线程过多可能会导致明显的延迟。