web-dev-qa-db-fra.com

Comment puis-je surveiller / enregistrer le pool de threads de Tomcat?

J'ai une installation Tomcat où je soupçonne que le pool de threads peut diminuer au fil du temps en raison de la libération incorrecte des threads. Je reçois une erreur dans catalina.out lorsque maxthreads est atteint, mais je voudrais enregistrer le nombre de threads en cours d'utilisation dans un fichier toutes les cinq minutes afin de pouvoir vérifier cette hypothèse. Quelqu'un pourrait-il, s'il vous plaît, vous conseiller sur la manière de procéder?

De plus, dans cette installation, il n'y a pas de gestionnaire Tomcat, il semble que celui qui a fait l'installation d'origine ait supprimé la gestionnaire Webapp pour une raison quelconque. Je ne sais pas si le gestionnaire serait en mesure de faire ce qui précède ou si je peux le réinstaller sans endommager l'installation existante? Tout ce que je veux vraiment faire, c'est garder une trace du pool de threads.

De plus, j'ai remarqué que maxthreads pour Tomcat est de 200, mais le nombre maximal de connexions simultanées pour Apache est inférieur (Apache utilise mod_proxy et mod_proxy_ajp (AJP 1.3) pour alimenter Tomcat). Cela semble faux aussi, quelle est la relation correcte entre ces chiffres?

Toute aide très appréciée: D

pdate: Juste une mise à jour rapide pour dire que l'accès direct à JMX a fonctionné. Cependant, j'ai également dû définir Dcom.Sun.management.jmxremote.Host. Je l'ai réglé sur localhost et cela a fonctionné, mais sans lui pas de dés. Si quelqu'un d'autre a un problème similaire en essayant d'activer JMX, je vous recommande de définir également cette valeur, même si vous vous connectez à partir de la machine locale. Semble qu'il est requis avec certaines versions de Tomcat.


Juste une mise à jour rapide pour dire que l'accès direct à JMX a fonctionné. Cependant, j'ai également dû définir Dcom.Sun.management.jmxremote.Host. Je l'ai réglé sur localhost et cela a fonctionné, mais sans lui pas de dés. Si quelqu'un d'autre a un problème similaire en essayant d'activer JMX, je vous recommande de définir également cette valeur, même si vous vous connectez à partir de la machine locale. Semble qu'il est requis avec certaines versions de Tomcat.

31
Alex P

Accès JMX direct

Essayez d'ajouter ceci à 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

MISE À JOUR: Alex P suggère que les paramètres suivants peuvent également être requis dans certaines situations:

-Dcom.Sun.management.jmxremote.Host=localhost

Cela permet des connexions JMX anonymes à distance sur le port 5005. Vous pouvez également considérer JVisualVM qui est beaucoup plus s'il vous plaît et permet de parcourir JMX via un plugin.

Ce que vous recherchez est Catalina -> ThreadPool -> http-bio-8080 -> diverses métriques intéressantes.

Servlet proxy JMX

La méthode la plus simple consiste à utiliser le servlet proxy JMX de Tomcat sous: http: // localhost: 8080/manager/jmxproxy . Par exemple, essayez cette requête:

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

Un peu de grepping et de script et vous pouvez facilement et à distance surveiller votre application. Notez que Tomcat:tomcat est le nom d'utilisateur/mot de passe de l'utilisateur ayant manager-jmx rôle dans conf/Tomcat-users.xml.

15
Tomasz Nurkiewicz

Pour une solution plus d'entreprise. J'utilise New Relic dans notre environnement de production.

Cela fournit un graphique des modifications apportées au pool de threads au fil du temps.

2
Tinman

Vous pouvez déployer jolokia.war puis récupérer les valeurs de mbeans dans JSON (sans le gestionnaire):

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

Si vous ne voulez que certaines valeurs (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
}

Remarque: cet exemple fonctionne sur Tomcat7 +.

2
c-toesca