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

时间:2018-05-29 05:00:28

标签: java tomcat8

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

是否以这种方式运作,如果是,您通常如何为selectorKeys选择最佳选项

提前感谢

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

3 个答案:

答案 0 :(得分:3)

最大客户端连接数为acceptCount + maxConnections。太低,请求可能会被不必要地拒绝。如果吞吐量无法跟上,那么客户可能会过于匮乏。

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

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

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

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

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

答案 1 :(得分:2)

  

例如我们有maxThreads = 2, maxConnections = 10000,然后第一个线程的Selector(来自java.nio)可以处理10000个并发请求,但是根据selectorKeys顺序执行每个请求,并且第二个线程的行为相同。

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

答案 2 :(得分:0)

我认为你问过的问题在这里得到了解答: Tomcat - maxThreads vs maxConnections

我认为这实际上取决于您的应用程序/服务的性质。最好对系统进行压力测试并找到最佳值。由于大量的上下文切换,IO重应用程序中的线程太多可能会导致严重的延迟。