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

Tomcat 8 NIO,how it works?

我创建了简单的 Spring Boot MVC 应用程序并注意到(使用 JVisualVM)我的所有线程都有前缀 nio。这意味着 Tomcat 使用 java.nio 包。我们可以将以下参数添加到 Tomcat 配置:maxThreads,maxConnections。据我所知,这意味着: 例如我们有 maxThreads = 2 , maxConnections = 10000,那么第一个线程的选择器(来自 java.nio)可以处理 10000 个并发请求,但是根据 selectorKeys 和第二个线程的相同行为。

是否以这种方式工作,如果是,您通常如何选择 maxConnections

的最佳选项

提前致谢

(顺便说一句,我使用 Tomcat 8 )

最大客户端连接数为acceptCount + maxConnections。太低,请求可能会被不必要地拒绝。太高了,如果吞吐量跟不上,客户可能会饿死。

acceptCount: - 默认为 100 - 这用作 ServerSocket.bindbacklog 参数。 OS 的 TCP 堆栈将最多排队 acceptCount 个挂起的套接字连接。这发生在 Tomcat 开始处理连接之前。

maxConnections: - 默认为 10,000 - Tomcat 允许内部进行的最大连接数。

maxThreads: - NIO和NIO下默认200 - 最大并发请求处理线程数

目标是优化服务可用性和性能并有效利用资源。这些设置将取决于您的请求处理器的延迟和负载分布。

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

我想你问的问题在这里得到了回答: Tomcat - maxThreads vs maxConnections

我相信这真的取决于你的性格application/service。最好对系统进行压力测试并找到最佳值。 IO 繁重的应用程序中过多的线程可能会因为大量的上下文切换而导致严重的延迟。

For example we have maxThreads = 2, maxConnections = 10000, then Selector of first thread (from java.nio) can handle 10000 concurrent requests, but execute each sequentially according to selectorKeys and the same behavior for the second thread.

没有。他们可以依次处理 10,000 个 ,在这种情况下,每个 5,000 个。最大值是全局的,而不是每个线程。