Tomcat压力测试超时

时间:2011-11-15 14:17:42

标签: java web-services tomcat tomcat6

我目前正在调查以下系统的问题:

  • 3.2 GHz 8核机器,24 GB RAM
  • Debian 6.0.2
    • ulimit -n 4096
    • ulimit -Sn 4096
    • ulimit -Hn 65535
  • Tomcat 6.0.28
    • -Xmx20g
  • MySQL 5.0.51a(通过hibernate和一些手动JDBC查询)
    • 还有很多缓存空间

我正在远程测试每分钟2000个请求对服务器的最常见请求。测试工具是最新的jMeter。平均响应时间约为65毫秒,最小值为35毫秒,最大值为4000毫秒(在极少数情况下,但有原因)。

就我观看htop而言,系统规格足以满足每分钟至少3倍的请求。 (平均CPU:25%,RAM:22GB中的5个)服务器本身一直可访问。 (在运行测试时不断对其进行ping操作。)

重要的是,每个请求都会向本地tomcat发出3个额外请求,其中第二个请求最终获取所需数据,最后一个请求用于统计信息: jMeter(1) - > RESTeasy-Service(2) - > ? - 服务(2) - >数据服务(2) - (新线程)>统计服务(2)

(1)是我的jMeter测试服务器,远离(2),这是tomcat服务器。是的,架构可能有点奇怪,但这不是我的错。 ^^

我将线程管理切换到server.xml中的池。设置1000个最大线程从默认200和10空闲从4开始。我注意到并发线程的数量从未减少,而是稳定上升到tomcat的最大似乎。 htop报告160 tomcat停止时的线程。当它刚刚开始时大约有460个。 (服务似乎开始了几个......)几分钟(有时候更少)用每分钟2000个请求命中服务器htop说有1400个任务。当我开始在jMeter中获得超时时,这个似乎是。因为这是非常耗时的,所以我没有看过它一千次因此无法保证这是原因,但这几乎就是发生的事情。

主要问题:

  1. 数学告诉我,同时使用的线程数永远不会超过600.(34个请求* 4个请求* 4秒= 544,甚至更少,但估计600个应该没问题)。据我了解线程池的想法,未使用的线程应该在空闲时间过长时释放和停止。还有一种方法可以获得一千个闲置(?)线程吗?这可以吗?

  2. 是否可以在其中一个请求处理器中手动启动线程,拒绝释放tomcat线程?

  3. 是否应该有任何日志消息告诉我tomcat无法为请求创建/获取线程?

  4. 还有其他想法吗?我正在研究这个问题已经太久了,现在tomcat耗尽它的线程池似乎是这些奇怪的超时的唯一正当理由。但也许有人有另一个暗示。

  5. 特别感谢你,尤其是如果你最终能救我的话......

2 个答案:

答案 0 :(得分:1)

经过几个小时和几天的惊心动魄后,我发现Tomcat达到它的线程限制时会发生超时,而我们正处于这三个本地连接开口的中间位置。我想如果它曾经达到那个限制,一个线程正在等待另一个线程打开,这在前一个不关闭时不会发生。在德语中,我称之为Teufelskreis。 ^^

无论如何,解决方案是将最大线程提升到一个荒谬的高数字:

<Executor name="tomcatThreadPool" namePrefix="catalina-exec-" maxThreads="10000" minSpareThreads="10"/>

我知道这不应该是要走的路,但不幸的是我们都知道我们的架构有点不切实际,没有人有时间改变它。

希望它有所帮助。 =)

答案 1 :(得分:0)

我想,这个问题需要了解底层HTTP / 1.1或HTTP / 1.1保持连接。

如果您将其用于REST Web服务,可能需要将连接器配置中的maxKeepAliveRequests参数设置为1.

    <Connector port="8080" protocol="HTTP/1.1" 
           connectionTimeout="20000"
           maxKeepAliveRequests="1" 
           redirectPort="8443" />

此设置可在$ CATALINA_HOME / conf / server.xml中找到。