我怎样才能确定我的NIO / APR连接器的Tomcat的maxThreads的最佳大小?

我正在使用Tomcat7的NIO / APR连接器。

例如

<Connector port="8080" protocol="org.apache.coyote.http11.Http11AprProtocol" connectionTimeout="3000" redirectPort="8443" URIEncoding="UTF-8" maxPostSize="0" maxThreads="200" enableLookups="false" disableUploadTimeout="false" maxKeepAliveRequests="-1" useBodyEncodingForURI="true" compression="on" compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain" /> 
  1. 我怎样才能确定我的NIO / APR连接器的Tomcat的maxThreads的最佳大小?

  2. maxThreads有什么好的开始价值?

OOTBconfiguration通常为每个连接器150至200个总接受线程。 此默认值适用于“平均”硬件上的中等负载/复杂性应用程序。

一般来说,一个轻量级,高性能的应用程序应该考虑使用每个CPU核心最多150个(接受)的线程(所以在一个4核心盒子上总共600个线程)。 更保守的设置,更重的应用程序将是300接受线程。 我希望大多数需求都在中间的某个地方(但是这需要一些分析),但这是高度情境化的 – 请参阅@ zagrimsan的答案。

显然HTTPS的开销略高,所以标准做法是相应地减less接受线程的数量。

使用APR /本地连接器可以提高吞吐量,但限制因素通常是应用程序configuration文件,所以再次没有幻数。

使用线程设置过高的危险在于服务器可能变成“终极忙碌” – 在pipe理线程和应用程序需求上花费了太多时间,其他一切都受到影响(GC特别是一个症状)。 这似乎与直觉相反,但通常较less。

正确configuration线程数的繁忙服务器将在重负载下正常退化。 太高,它会倒下!

现在,有一些相关的设置(接受计数,分钟线程,等待等),也将需要调整,以适应,但这超出了这个答案的范围。

答案取决于你期待的服务。

引用来自StackOverflow的线程所接受的答案,尽pipe它谈到Tomcat和Apache的设置,但在这里也适用:

您应该考虑服务器可能获得的工作量。

最重要的因素可能是在高峰时间同时连接的客户端的数量。 尝试确定它,并调整您的设置的方式:

  • 有足够的处理线程,当服务器负载很重时,他们不需要产生新的线程
  • 在服务器中没有更多的处理线程,因为它们会浪费资源。

[…]

例如,考虑一个应用程序,你有约300个新的请求/秒。 每个请求平均需要2.5秒才能提供服务。 这意味着在任何时候你有大约750个需要同时处理的请求。 在这种情况下,您可能需要调整服务器,以便在启动时拥有〜750个处理线程,并且您可能需要最多添加〜1000个处理线程来处理极高的负载。