2016-01-11 33 views
1

我有一个Java Web服务,它执行一些资源密集型数据处理。我试图调整这样的Tomcat连接器属性为maxThreads,maxConnectionsacceptCount,以防止服务过载。 我还创建了一个模拟服务生产负载的测试客户端。 在启动客户端后的几分钟内,我看到Tomcat按照预期的方式运行。以下是此期间的典型CPU负载直方图。 Initial CPU load调整Tomcat连接器

然后我看到响应时间增加,并在很短的时间内拒绝连接的数量达到100%。 令我惊讶的是,CPU负载远不及100%,并且其“脉冲”特性。

CPU thready pulse

当前连接器设置如下。

<Connector port="80" protocol="HTTP/1.1" 
      connectionTimeout="4000" redirectPort="8443" 
      minSpareThreads="8" maxThreads="12" maxConnections="24" acceptCount="8" /> 

有没有人可以为我的情况建议适当的值?

+1

您显示的连接器配置高度依赖于其他因素。什么版本的Tomcat?你在使用'tcnative'吗?你可以在Tomcat启动时检查你的'logs/catalina.out'文件。 –

回答

0

事实证明,某些特定请求需要很长时间来处理(几分钟)。 我发现(感谢伟大的工具VisualVM),随着线程数量的减少,它们都被这些长时间运行的请求所占用。因此,Tomcat拒绝所有新的请求,尽管可用的CPU容量。 在对这些长时间运行的请求采取一些预防措施后,服务将以所需的方式工作。

1

有没有人可以为我的情况建议适当的值?

找到“合适的”值并不是直截了当的。要理解为什么拒绝连接达到100%,您需要查看这些maxConnections="24"正在执行的操作。

上面的发现就像发送kill -3 <tomcat_pid>和观察线程转储输出catalina.out一样简单。可能缺乏的资源可能不是CPU,而是其他的,例如数据库,严重执行的锁定,或者你还没有想过的另一个问题。