我正在为 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"
/>
如何确定 Tomcat 的 NIO/APR 连接器的 maxThreads 的最佳大小?
maxThreads 的合适起始值是多少?
答案1
OOTB 配置通常为每个连接器提供 150 – 200 个总接受线程。此默认配置适用于“普通”硬件上的中等负载/复杂度应用程序。
一般来说,轻量级高性能应用程序应考虑每个 CPU 核心最多使用 150 个(接受)线程(因此 4 核机箱上总共 600 个)。对于更重量级的应用程序,更保守的设置是 300 个接受线程。我预计大多数要求都在中间位置(但这需要一些分析),但这高度依赖于具体情况 - 请参阅@zagrimsan 的回答。
显然HTTPS的开销稍微高一些,所以标准做法是相应地减少接受线程的数量。
使用 APR/本机连接器可以提高吞吐量,但限制因素通常是应用程序配置文件,因此,再说一次,没有神奇的数字。
使用过高的线程设置的风险在于服务器可能变得“非常繁忙”——大量时间都花在管理线程和应用程序需求上,其他一切都会受到影响(GC 就是其中一个明显的症状)。这似乎违反直觉,但通常来说,少即是多。
线程数配置正确的繁忙服务器在高负载下会降级。负载过高就会崩溃!
现在,有许多相关设置(接受计数、最小线程、等待等)也需要进行调整,但这超出了本答案的范围。
答案2
答案取决于您期望承载的负载。
引用已接受的答案来自 StackOverflow 的一个帖子尽管它讨论了使用 Tomcat 和 Apache 的设置,但这里也适用:
您应该考虑服务器可能承受的工作量。
最重要的因素可能是高峰时段同时连接的客户端数量。尝试确定它并调整设置,以便:
- 有足够的处理线程,当服务器负载过重时,它们不需要生成新线程
- 服务器中不应存在比所需更多的处理线程,因为这会浪费资源。
[...]
例如,假设某个应用程序每秒有大约 300 个新请求。每个请求平均需要 2.5 秒才能完成。这意味着在任何给定时间,您都有大约 750 个请求需要同时处理。在这种情况下,您可能希望调整服务器,使其在启动时拥有大约 750 个处理线程,并且您可能希望最多添加大约 1000 个处理线程来处理极高的负载。