在Tomcat 7中增加并发连接数

5

想知道如何增加Tomcat 7中的并发连接数。我进行了一些研究,从Apache文档中发现设置acceptCount、maxConnections的值以及增加maxThreads可以实现,但是当我尝试时,我只能提交1000个请求中的500个请求。下面是我的server.xml文件片段 -

      <Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
       maxThreads="2000" acceptCount="1000" maxConnections="1000"
       scheme="https" secure="true"
       keystoreFile="certs/tomcat.keystore" keystorePass="xxxxxxxx"
       clientAuth="false" sslProtocol="TLS" server="Apache" />

您能帮助我找到最简单的方法来解决这个问题吗?

谢谢, Sirish。


你应该进行线程转储以查找是什么阻塞了请求,因为你已经配置了2000个线程(最大值但不是最小值,所以Tomcat需要在运行时创建更多的线程)。然而,2000个线程太多了,你确定你需要这么多吗? - Frank Pavageau
嗨,弗兰克,我只是在试玩中找出是否增加线程会有任何差异,并且也意识到这会导致内存问题。此时,我希望配置服务器以接受尽可能多的连接,而不是默认的200个线程(由tomcat默认设置)。顺便问一下,如何进行线程转储?非常感谢您的帮助!谢谢。 - Sirish
要获取线程转储,您可以使用kill -3 PID(如果您在某些Unix上;在Windows上有一个Ctrl-something组合键可实现相同的结果),这将在标准输出上打印线程转储,或者使用jstack PID> threads.txt,其中jstack是JDK的一部分。即使您只有200个线程,如果它们都被并发请求使用,分析起来也会非常漫长。 - Frank Pavageau
1个回答

14
创建大量线程并接受大量请求并不意味着您的服务器将能够处理这些请求。如果您有 N 个线程但只有 M 个物理处理器/核心,则如果 M >= N,则每个线程将获得1个处理器,如果 M < N,则平均每个线程只能获得 M/N 个处理器。假设您有 N 个请求,每个请求在一个线程上运行,并且每个请求需要 R 秒的 CPU 时间。运行一个请求所需的平均时间 T = Min(R, R * N / M) 秒。很明显,随着您增加活跃线程和请求的数量 N,每个单独请求的平均消耗时间 T 将成比例增加。此外,如果您有大量线程,它们都将使用内存,并且都将竞争访问共享数据结构或数据库。所有这些额外资源使用和竞争都以各种方式增加了系统的开销。因此,我怀疑的是,当有那么多线程尝试同时处理请求时,时间 T 开始接近客户端或服务器端请求超时。当请求超时时,这反过来会减少完成的请求吞吐量,因为通常情况下对每个超时请求执行的工作都是浪费的。除非请求涉及与慢速外部服务通信,否则我建议您将线程数减少到不超过200个,即Tomcat默认值。我预计这将增加系统吞吐量。它不一定能够让您处理所有在该时期启动的1,000个请求,但我预测它将增加成功处理的请求数量。注意:增加线程数到1000甚至并不意味着您将能够接受1000个请求。如果有数百个处于RUNNABLE状态的线程,则Tomcat的监听器线程(调用ServerSocket.accept()的线程)可能会因 CPU 不足而无法跟上请求到达速率。您需要对系统进行一些性能调优,但我不会惊讶如果将其进一步降低会进一步改善情况。这将取决于您的硬件、应用程序和(我预计的)后端数据库。

3
我同意 @StephenC 的观点。我们的生产应用程序(具有相当高的流量)中,我们将最大线程数降低到20,因为它们响应速度足够快,平均同时处理的请求数量约为1或2(通过JMX监视),当发生问题(无响应的Web服务、异常长的GC暂停)时,我们不会突然出现200个并发请求及其内存开销需要管理,这实际上会加剧情况恶化。上限存在是为了防止应用程序耗尽资源,而不是限制吞吐量。 - Frank Pavageau

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接