【问题标题】:Tomcat Stress Test TimeoutTomcat 压力测试超时
【发布时间】:2011-12-29 13:52:19
【问题描述】:

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

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

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

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

重要的是,每个请求都会对本地 tomcat 产生 3 个额外的请求,第二个请求最终获得所需的数据,最后一个用于统计: jMeter(1) -> RESTeasy-Service(2) -> ?-Service(2) -> Data-Service(2) -(new Thread)> Statistic-Service(2)

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

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

主要问题:

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

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

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

  4. 还有其他想法吗?我在这方面工作的时间太长了,现在 tomcat 耗尽它的线程池似乎是这些奇怪超时的唯一正当原因。但也许有人另有暗示。

在此先感谢您,尤其是如果您最终能将我从这件事中拯救出来……

【问题讨论】:

  • 您是否对正在运行的 Tomcat 服务器进行了线程转储以确定是否有空闲线程?你可以看到每个人在做什么,如果不发布,他们会卡在哪里
  • jconsole 对存在的线程有什么看法?
  • @Sean 我如何处理这个线程转储?
  • @artbristol 这是一台没有x11的服务器机器,所以据我所知没有jConsole。
  • 您不需要服务器上的 X11 来运行 jconsole。您可以使用 -X 选项进行 ssh,并且 jconsole 将出现在您自己的 PC 上(假设您正在运行 X 服务器)。

标签: java web-services tomcat tomcat6


【解决方案1】:

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

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

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

我知道这不应该是要走的路,但不幸的是,我们在这里都知道我们的架构有些不切实际,没有人有时间对其进行更改。

希望它对某人有所帮助。 =)

【讨论】:

    【解决方案2】:

    我猜,这个问题需要对底层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 中找到。

    【讨论】:

    • o.o 这是一个很好的提示。非常感谢!
    • 这不一定是灵丹妙药。我已经设置了这个,我遇到了和 OP 一样的问题。
    • 嗨 Shabbyrobe,我同意在调整 Tomcat 时没有银弹之类的东西。您必须逐个查看,从一个瓶颈到其他瓶颈。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    • 2011-08-11
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    相关资源
    最近更新 更多