Tomcat 8 NIO,它是如何工作的?

3
我创建了一个简单的Spring Boot MVC应用程序并注意到(使用JVisualVM),所有线程都具有nio前缀。这意味着Tomcat使用java.nio包。我们可以将以下参数添加到Tomcat配置中:maxThreads,maxConnections。据我所知,这意味着: 例如,我们有maxThreads = 2,maxConnections = 10000,那么第一个线程的选择器(来自java.nio)可以处理10000个并发请求,但是根据selectorKeys按顺序执行每个请求,并且第二个线程的行为相同。
它是否以这种方式工作,如果是的话,您通常如何选择maxConnections的最佳选项?
提前感谢
(顺便说一下,我使用Tomcat 8)

你能更明确地解释一下“选择maxConnections的最佳选项”是什么意思吗? - regulus
1
如果你可以设置1000或2000,你会选择哪个并解释原因。 - Almas Abdrazak
3个回答

10
最大客户端连接数为acceptCount+maxConnections。如果设置过低,可能会不必要地拒绝请求。如果设置过高,如果吞吐量无法跟上,则客户端可能会被饿死。 acceptCount: - 默认为100 - 这用作ServerSocket.bindbacklog参数。操作系统的TCP堆栈将排队最多acceptCount个挂起的套接字连接。这发生在Tomcat开始处理连接之前。 maxConnections: - 默认为10,000 - Tomcat允许在内部进行的最大连接数。 maxThreads: - 在NIO和NIO2下默认为200 - 最大并发请求处理线程数。
目标是优化服务可用性和性能,并有效利用资源。设置取决于请求处理器的延迟和负载分布。

根据目标,容量规划有许多不同的方法。一个简单的选择是将maxThreads增加到使服务器无法在合理的时间内安全处理任何其他请求的点。在饱和状态下,接受更多连接是不可取的,因为清除它们需要太长时间。因此,请考虑每个处理线程需要多少CPU时间和RAM以及可以同时安全运行多少个。


从文档中可以看到,默认情况下maxConnections = 10000,maxThreads = 200。 也许我理解有误,如果maxConnections = 1000,那么每个Tomcat线程可以处理1000个连接,还是所有Tomcat线程一起可以处理1000个连接? - Almas Abdrazak
挂起连接的最大数量是 acceptCount活动连接的最大数量是 maxConnections - user207421
@AlmasAbdrazak 每个请求处理线程一次只处理一个请求,按顺序进行。当一个线程完成了一个请求,它会从队列中获取另一个挂起的请求。maxConnections 是同时处于活动状态和在任何给定时间内被监视的套接字连接数量。(这与处理套接字IO事件的NIO线程数完全不同。) - jspcal

3
比如我们有 maxThreads = 2, maxConnections = 10000,那么第一个线程的选择器(来自 java.nio)可以处理 10000 个并发请求,但是按照 selectorKeys 顺序顺序执行每个请求,第二个线程也是同样的行为。
不是的。在这种情况下,它们可以共同处理 10000 个请求,每个线程处理 5000 个请求,按顺序逐个执行。最大值为全局配置,而非每个线程。

0

我认为你所问的问题在这里已经得到了回答: Tomcat - maxThreads vs maxConnections

我相信这真的取决于你的应用/服务的性质。最好进行压力测试并找到最佳值。在IO密集型应用程序中有太多的线程可能会因上下文切换次数过高而导致显着的延迟。


谢谢回复,但是我的主要问题是,我对Tomcat中的NIO线程工作方式的理解是否正确? - Almas Abdrazak
我相信这里已经有答案了:https://dev59.com/0WAf5IYBdhLWcg3wZSFI - regulus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接