如何确定适用于 Tomcat 的 NIO/APR 连接器的 maxThreads 的最佳大小?

con*_*ile 7 tomcat tomcat6 tomcat7

我正在为 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"   
        />
Run Code Online (Sandbox Code Playgroud)
  1. 如何确定适用于 Tomcat 的 NIO/APR 连接器的 maxThreads 的最佳大小?

  2. maxThreads 的一个好的起始值是多少?

Mic*_*ael 7

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

作为一般经验法则,轻量级、高性能应用程序应该考虑每个 CPU 内核最多使用 150 个(接受)线程(因此在 4 核机器上总共使用 600 个)。对于更重量级的应用程序,更保守的设置是 300 个接受线程。我希望大多数要求都在中间的某个地方(但这需要一些分析),但这是高度情境化的 - 请参阅@zagrimsan 的回答。

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

使用 APR / 本机连接器可以提高吞吐量,但限制因素通常是应用程序配置文件,所以同样,没有幻数。

使用太高的线程设置的危险是服务器可能变得“终端繁忙”——在管理线程和应用程序需求上花费了太多时间,其他一切都会受到影响(GC 是一个明显的症状)。这似乎违反直觉,但通常少即是多。

正确配置线程数的繁忙服务器将在重负载下正常降级。太高了会摔倒!

现在,有许多相关设置(接受计数、最小线程数、等待等)也需要进行调整以适应,但这超出了本答案的范围。