32

我有一个 Tomcat 安装,我怀疑由于线程未正确释放,线程池可能会随着时间的推移而减少。当达到 maxthreads 时,我在 catalina.out 中收到一个错误,但我想每五分钟将正在使用的线程数记录到一个文件中,以便我可以验证这个假设。任何人都可以建议如何做到这一点?

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

另外,我注意到 Tomcat 的最大线程数为 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需要它。

4

4 回答 4

15

直接 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-> ThreadPool-> http-bio-8080-> 各种有趣的指标。

JMX 代理 servlet

更简单的方法可能是在http://localhost:8080/manager/jmxproxy下使用 Tomcat 的JMX 代理 servlet。例如试试这个查询:

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

一点点grepping 和脚本,您就可以轻松地远程监控您的应用程序。请注意,这tomcat:tomcat是具有manager-jmx角色的用户的用户名/密码conf/tomcat-users.xml

于 2011-09-07T12:30:52.943 回答
3

您可以部署jolokia.war,然后以 JSON 格式检索 mbeans 值(无需管理器):

http://localhost:8080/jolokia/read/Catalina:name=*,type=ThreadPool?ignoreErrors=true

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

http://localhost:8080/jolokia/read/Catalina:name=*,type=ThreadPool/currentThreadsBusy,maxThreads,currentThreadCount,connectionCount?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
}

注意:此示例适用于 Tomcat7 +。

于 2017-03-24T23:20:32.097 回答
2

对于更多的企业解决方案。我一直在我们的生产环境中使用 New Relic。

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

于 2013-07-12T07:03:40.690 回答
0

同时还有更便宜的工具:我在这里使用这个 jar:https ://docs.cyclopsgroup.org/jmxterm 您可以通过 shell/batch 脚本自动化它。我对输出进行了正则表达式,让 prometheus 轮询它以在 grafana 中显示它。

于 2022-02-17T08:47:07.803 回答