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

如何确定 Tomcat 的 NIO/APR 连接器的 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. 如何确定 Tomcat 的 NIO/APR 连接器的 maxThreads 的最佳大小?

  2. maxThreads 的合适起始值是多少?

答案1

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

一般来说,轻量级高性能应用程序应考虑每个 CPU 核心最多使用 150 个(接受)线程(因此 4 核机箱上总共 600 个)。对于更重量级的应用程序,更保守的设置是 300 个接受线程。我预计大多数要求都在中间位置(但这需要一些分析),但这高度依赖于具体情况 - 请参阅@zagrimsan 的回答。

显然HTTPS的开销稍微高一些,所以标准做法是相应地减少接受线程的数量。

使用 APR/本机连接器可以提高吞吐量,但限制因素通常是应用程序配置文件,因此,再说一次,没有神奇的数字。

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

线程数配置正确的繁忙服务器在高负载下会降级。负载过高就会崩溃!

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

答案2

答案取决于您期望承载的负载。

引用已接受的答案来自 StackOverflow 的一个帖子尽管它讨论了使用 Tomcat 和 Apache 的设置,但这里也适用:

您应该考虑服务器可能承受的工作量。

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

  • 有足够的处理线程,当服务器负载过重时,它们不需要生成新线程
  • 服务器中不应存在比所需更多的处理线程,因为这会浪费资源。

[...]

例如,假设某个应用程序每秒有大约 300 个新请求。每个请求平均需要 2.5 秒才能完成。这意味着在任何给定时间,您都有大约 750 个请求需要同时处理。在这种情况下,您可能希望调整服务器,使其在启动时拥有大约 750 个处理线程,并且您可能希望最多添加大约 1000 个处理线程来处理极高的负载。

相关内容