如何监控/记录 Tomcat 的线程池?

2022-09-01 10:02:51

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

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

另外,我注意到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需要它。


答案 1

直接访问 JMX

尝试将此添加到 /:catalina.shbat

-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。

您正在寻找的是->->->各种有趣的指标。CatalinaThreadPoolhttp-bio-8080

JMX proxy servlet

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

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

只需一点点 ping 和脚本编写,您就可以轻松远程地监视应用程序。请注意,这是在 中具有角色的用户的用户名/密码。greptomcat:tomcatmanager-jmxconf/tomcat-users.xml


答案 2

您可以部署 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 +。