我创建了简单的Spring应用程序,并注意到(使用JVisualVM)我的所有线程都有前缀nio。这意味着Tomcat使用java.nio包。我们可以将以下参数添加到Tomcat配置中:maxThreads,maxConnections。我知道这意味着:例如,我们有maxThreads =2,maxConnections = 10000,那么第一个线程的选择器(来自java.nio)可以处理10000并发请求,但是可以根据selectorKeys顺序执行每个请求,对于第二个线程执行相同的行为。
它是否以这种方式工作,如果是,您通常如何选择maxConnections的最佳选项?
提前感谢
(顺便说一句,我用Tomcat 8)
发布于 2018-05-29 05:27:21
客户端连接的最大数量是acceptCount + maxConnections。要求太低,可能会不必要地被拒绝。如果吞吐量跟不上,那么客户可能会挨饿。
默认情况下,acceptCount: - 100用作ServerSocket.bind的backlog参数。操作系统的TCP堆栈最多将在acceptCount挂起的套接字连接上排队。这发生在Tomcat开始处理连接之前。
默认情况下,maxConnections: - 10,000 --是Tomcat允许在内部进行的最大连接数。
默认情况下,maxThreads: - 200在NIO和NIO2下-并发请求处理线程的最大数量。
目标是优化服务可用性和性能,并有效地利用资源。这些设置将取决于请求处理器的延迟和负载分布。
根据目标的不同,能力规划有许多不同的方法。一个简单的选择是增加maxThreads,使服务器无法在合理的时间内安全地处理任何额外的请求。在这个饱和点,接受更多的连接是不可取的,因为清除它们需要太长时间。因此,考虑每个处理线程需要多少CPU时间和RAM,以及能够同时安全运行多少CPU时间和RAM。
发布于 2018-05-29 05:56:37
例如,我们有
maxThreads = 2, maxConnections = 10000,那么第一个线程的选择器(来自java.nio)可以处理10000个并发请求,但是按照selectorKeys顺序执行每个请求,对于第二个线程执行相同的行为。
不是的。他们可以处理10,000人之间,在这种情况下,每个5,000,顺序。最大值是全局的,而不是每个线程。
发布于 2018-05-29 05:34:14
我想你的问题在这里得到了回答:Tomcat - maxThreads vs maxConnections
我相信这确实取决于您的应用程序/服务的性质。最好是对系统进行应力测试,找出最优值。IO重应用程序中过多的线程可能会由于大量的上下文切换而导致严重的延迟。
https://stackoverflow.com/questions/50576591
复制相似问题