Tomcat - Application qui devient lente sans raison apparente

kortex
2021-11-15T08:19:06+01:00
général.général, openjdk, jdk, tomcat, ubuntu, java

Bonjour,

Je me permets de vous solliciter pour un problème avec Tomcat.

Petites précisions de taille des fois que mes questions soient stupides :

je viens de commence un nouvel emploi (2 semaines)

ma nouvelle entreprise utilise Tomcat

je n'ai jamais travaillé sur Tomcat auparavant

ce sont sûrement des VMs mais je n'ai absolument pas la main sur la partie hyperviseur (les machines nous sont fournies par des partenaires)

Nous avons une application hébergée sur 3 serveurs.
2 serveurs qui n'ont jamais le soucis :

OS : Ubuntu 18.04 LTS

Tomcat : 8.5.39 ; source = dépôts Ubuntu

JDK : openjdk-8 ; 8u292 ; source = dépôts Ubuntu

Le 3ème serveur - celui qui a un potentiel soucis :

OS : Ubuntu 20.04 LTS

Tomcat : 9.0.31 ; source = dépôts Ubuntu

JDK : openjdk-8 ; 8u282 ; source = dépôts Ubuntu

Description du soucis : après quelques jours (2 ou 3 jours mais c'est variable) notre application devient super lente.
Exemple : si nous faisons un wget depuis le serveur sur http://127.0.0.1:8080/path/to/our/app l'application mets plusieurs secondes à répondre.

J'ai regardé plusieurs métriques comme :

utilisation CPU

utilisation mémoire

utilisation réseau

utilisation IO

nombre d'éléments ouverts (lsof)

--> RAS : tout est au vert (la machine ne semble pas utilisée).

J'ai donc tenté de reproduire le problème dans une VM locale mais je n'y arrive pas…
Dans ma VM locale j'ai testé d'améliorer la verbosité des logs de Tomcat en modifiant le fichier /etc/tomcat9/logging.properties pour tout passer à ALL :

# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional ALLrmation regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

handlers = 1catalina.org.apache.juli.AsyncFileHandler, 2localhost.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

.handlers = 1catalina.org.apache.juli.AsyncFileHandler, java.util.logging.ConsoleHandler

############################################################
# Handler specific properties.
# Describes specific configuration ALL for Handlers.
############################################################

1catalina.org.apache.juli.AsyncFileHandler.level = ALL
1catalina.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
1catalina.org.apache.juli.AsyncFileHandler.prefix = catalina.
1catalina.org.apache.juli.AsyncFileHandler.maxDays = 90

2localhost.org.apache.juli.AsyncFileHandler.level = ALL
2localhost.org.apache.juli.AsyncFileHandler.directory = ${catalina.base}/logs
2localhost.org.apache.juli.AsyncFileHandler.prefix = localhost.
2localhost.org.apache.juli.AsyncFileHandler.maxDays = 90

java.util.logging.ConsoleHandler.level = ALL
java.util.logging.ConsoleHandler.formatter = org.apache.juli.SystemdFormatter


############################################################
# Facility specific properties.
# Provides extra control for each logger.
############################################################

org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = ALL
org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.AsyncFileHandler

# For example, set the org.apache.catalina.util.LifecycleBase logger to log
# each component that extends LifecycleBase changing state:
#org.apache.catalina.util.LifecycleBase.level = ALL

# To see debug messages in TldLocationsCache, uncomment the following line:
#org.apache.jasper.compiler.TldLocationsCache.level = ALL

# To see debug messages for HTTP/2 handling, uncomment the following line:
#org.apache.coyote.http2.level = ALL

# To see debug messages for WebSocket handling, uncomment the following line:
#org.apache.tomcat.websocket.level = ALL

Mais je n'ai pas l'impression d'attraper plus de logs quand au fonctionnement interne de Tomcat (je ne vois aucune différence entre avant et après en faites)…

Nous avons essayé de redémarrer juste notre application mais il n'y a aucun changement : le problème persiste.

La seule solution qui fonctionne c'est de redémarrer Tomcat 9.

Pour le moment j'ai des idées "à l'aveugle" qui consistent à :

1. Mettre à jour le JDK pour faire le saut 8u282 --> 8u292

2. Mettre à jour toute la VM + restart

3. Installer un Tomcat 9 à la main pour être sur la dernière version

Mais avant j'avoue que j'aurais bien aimé avoir un peu plus de logs ou, pourquoi pas, une idée quant à la raison du problème si quelqu'un l'a déjà rencontré :)

Je vous remercie d'avance :)