【发布时间】: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中获得超时的时间点。由于这非常耗时,我没有看过一千遍,因此无法保证这是原因,但这几乎就是发生的事情。
主要问题:
Math 告诉我并发使用的线程数永远不应超过 600。(34 个请求 * 4 个请求 * 4 秒 = 544,甚至更少,但估计 600 应该没问题)。据我了解线程池的概念,未使用的线程应该在空闲时间过长时被释放和停止。还有一种方法可以获得一千个空闲(?)线程吗?这样可以吗?
是否可以在其中一个请求处理器中手动启动线程拒绝释放 tomcat 线程?
不应该有任何日志消息告诉我 tomcat 无法为请求创建/获取线程吗?
还有其他想法吗?我在这方面工作的时间太长了,现在 tomcat 耗尽它的线程池似乎是这些奇怪超时的唯一正当原因。但也许有人另有暗示。
在此先感谢您,尤其是如果您最终能将我从这件事中拯救出来……
【问题讨论】:
-
您是否对正在运行的 Tomcat 服务器进行了线程转储以确定是否有空闲线程?你可以看到每个人在做什么,如果不发布,他们会卡在哪里
-
jconsole 对存在的线程有什么看法?
-
@Sean 我如何处理这个线程转储?
-
@artbristol 这是一台没有x11的服务器机器,所以据我所知没有jConsole。
-
您不需要服务器上的 X11 来运行 jconsole。您可以使用 -X 选项进行 ssh,并且 jconsole 将出现在您自己的 PC 上(假设您正在运行 X 服务器)。
标签: java web-services tomcat tomcat6