Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何监视/记录Tomcat';谁的线程池?_Java_Multithreading_Tomcat_Pool_Ajp - Fatal编程技术网

Java 如何监视/记录Tomcat';谁的线程池?

Java 如何监视/记录Tomcat';谁的线程池?,java,multithreading,tomcat,pool,ajp,Java,Multithreading,Tomcat,Pool,Ajp,我有一个Tomcat安装,我怀疑线程池可能会随着时间的推移而减少,因为没有正确地释放线程。当到达maxthreads时,我在catalina.out中得到一个错误,但我希望每五分钟将正在使用的线程数记录到一个文件中,以便验证这个假设。有谁能告诉我怎么做 此外,在这个安装中没有Tomcat manager,似乎是最初安装的人出于某种原因删除了manager webapp。我不确定manager是否能够执行上述操作,或者我是否可以在不损坏现有安装的情况下重新安装它?我真正想做的就是跟踪线程池 另外,

我有一个Tomcat安装,我怀疑线程池可能会随着时间的推移而减少,因为没有正确地释放线程。当到达maxthreads时,我在catalina.out中得到一个错误,但我希望每五分钟将正在使用的线程数记录到一个文件中,以便验证这个假设。有谁能告诉我怎么做

此外,在这个安装中没有Tomcat manager,似乎是最初安装的人出于某种原因删除了manager webapp。我不确定manager是否能够执行上述操作,或者我是否可以在不损坏现有安装的情况下重新安装它?我真正想做的就是跟踪线程池

另外,我注意到Tomcat的maxthreads是200,但Apache的最大并发连接数较低(Apache使用mod_proxy和mod_proxy_ajp(ajp 1.3)为Tomcat提供数据)。这似乎也是错误的,这些数字之间的正确关系是什么

非常感谢任何帮助:D

更新:简单更新一下,说明直接JMX访问有效。但是,我还必须设置Dcom.sun.management.jmxremote.host。我将它设置为localhost,它就工作了,但是如果没有它,就没有骰子了。如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您是从本地计算机连接。某些版本的Tomcat似乎需要它


只是简单更新一下,说明直接JMX访问有效。但是,我还必须设置Dcom.sun.management.jmxremote.host。我将它设置为localhost,它就工作了,但是如果没有它,就没有骰子了。如果其他人在尝试启用JMX时遇到类似问题,我建议您也设置此值,即使您是从本地计算机连接。某些版本的Tomcat似乎需要它。

直接JMX访问 尝试将此添加到catalina.sh/
bat

-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.port=5005
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
更新:Alex p建议在某些情况下可能还需要以下设置:

-Dcom.sun.management.jmxremote.host=localhost
这将在端口5005上启用远程匿名JMX连接。您也可以考虑JVisualVM,它更为方便,允许通过插件浏览JMX。 您正在寻找的是Catalina->
线程池
->
http-bio-8080
->各种有趣的指标

JMX代理servlet 更简单的方法可能是在以下位置使用Tomcat:。例如,请尝试以下查询:

$ curl --user tomcat:tomcat http://localhost:8080/manager/jmxproxy?qry=Catalina:name=%22http-bio-8080%22,type=ThreadPool

只需一点
grep
ping和脚本,您就可以轻松地远程监控您的应用程序。请注意,
tomcat:tomcat
是在
conf/tomcat users.xml

中担任
manager jmx
角色的用户的用户名/密码,用于更企业化的解决方案。我一直在我们的生产环境中使用New Relic

这提供了线程池随时间变化的图表。

您可以部署并检索JSON中的mbeans值(无需管理器):

如果只需要一些值(currentThreadsBusy、maxThreads、currentThreadCount、connectionCount):


注意:此示例适用于Tomcat7+

如果您在Java 5+上运行,您可能能够使用jconsole监视JVM线程池。我尝试使用jconsole连接到Tomcat,但失败了(这是尝试在本地主机上使用Tomcat的PID进行连接,而不是远程连接)。我需要启用JMX来使用jconsole吗?当然,在Java5中,您需要启用JMX。从Java6开始,本地访问不需要这样做。另外还有一个Hotspot JVM选项,它从命令行创建线程转储(IIRC它是
-XX:+HeapDumpOnCrtlBreak
,它将创建堆转储和线程转储),您能显示tomcat给出的错误消息吗?tomcat的max threads设置是指它可以使用的连接器数量,本质上是它可以处理的并发连接数量。。。所以你提到的两个数字应该是相似的。至少这是我的理解错误是严重的:所有线程(200)当前都很忙,正在等待。增加最大线程数或检查servlet状态。同样,当这种情况发生时,Tomcat停止服务页面并给出503。我认为这两个数字应该是相似的ie MaxClient在Apache中是最大数量的同时连接,所以这不是也应该是200吗?谢谢Tomasz,我会试试看。我不认为我可以使用代理servlet,因为它位于管理器下,不幸的是,由于某种原因,它似乎已从安装中删除-admin dir存在,但管理器不存在。我尝试如上所述使用curl/jmxproxy,但它只给出了一个404,因此我认为管理器已损坏,我将尝试在上面建议的显式端口上启用JMX,看看是否有效。谢谢大家的帮助!很棒的工具。太糟糕了,定价太疯狂了。您可以通过使用通配符避免引用http-nio-8080或http-bio-8080,这将带来所有线程池:
curl-XGET'http://localhost:8080/jolokia/read/Catalina:name=*,type=ThreadPool?ignoreErrors=true'
{
    request: {
       mbean: "Catalina:name="http-nio-8080",type=ThreadPool",
       attribute: [
          "currentThreadsBusy",
          "maxThreads",
          "currentThreadCount",
          "connectionCount"
       ],
       type: "read"
    },
    value: {
       currentThreadsBusy: 1,
       connectionCount: 4,
       currentThreadCount: 10,
       maxThreads: 200
    },
    timestamp: 1490396960,
    status: 200
}