首页 > 解决方案 > Tomcat 8 NIO,它是如何工作的?

问题描述

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

它是否以这种方式工作,如果是,您通常如何选择最佳选项?maxConnections

预先感谢

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

标签: javatomcat8

解决方案


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

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

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

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

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

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


推荐阅读