2012-07-10 9 views
1

J'ai une application Web (printemps/hibernation) fonctionnant sur Tomcat 7.0.23. Le symptôme est qu'après avoir fonctionné pendant quelques jours (4 à 5 jours typiquement) la réponse devient très lente. La page qui charge généralement en 2 secondes prend n'importe où de 30 à 50 secondes. Un redémarrage ramène la réponse à la normale (2 sec). J'ai pris des vidages de threads avant et après. Je vois le fil dans question (qui prend plus de temps pour répondre) a un verrou. Voici l'extrait .Webapp devient lent sur Tomcat

at org.apache.coyote.ajp.AjpProcessor.process(AjpProcessor.java:200) 
    at 
org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:539) 
    at 
org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:298) 
    - locked <0x0000000799446298> (a 
org.apache.tomcat.util.net.SocketWrapper) 
    at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110) 
    at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603) 
    at java.lang.Thread.run(Thread.java:722) 

En regardant dans le code, il existe une méthode synchronisée et que explique la serrure. Mais, je me demande si le verrouillage ralentit les choses, alors pourquoi ne pas se manifester à partir du nouveau départ et pourquoi seulement après en cours d'exécution pendant quelques jours. Vous vous demandez où regarder. Des indices? Merci d'avance.

Répondre

0

Je vous suggère d'effectuer un test de base en utilisant quelque chose comme jmeter ou soapui.

Augmentez lentement la charge et voyez ce qui se passe: est-ce que le temps moyen passe à travers le toit ou est-ce que ça devient un peu plus lent? Avez-vous des erreurs ou est-ce encore opérationnel?

En attendant, ouvrez visualvm et jetez un oeil à votre machine virtuelle. Vous pouvez tomber sur une mémoire pbs, GC occupé à essayer de libérer des instances inutilisées ou peut-être des verrous? utilisez les fonctions de vidage de thread et de vidage de tas pour aller un peu plus loin.

J'ai effectué un tel test sur une application très ancienne et j'ai découvert que log4j 1.x avait de gros problèmes avec le multi-threading: mise à niveau vers log4j 2 -> problème résolu!

Espérons que cela aide.

Questions connexes