2012-06-01 11 views
6

Ich habe eine Webanwendung, die oft übermäßig viel Zeit für die Bereitstellung auf Tomcat benötigt. Mein Verdacht ist, dass es irgendwo eine Datenbankverbindung gibt, die auf eine Zeitüberschreitung wartet, aber das ist nur eine Vermutung und ich möchte herausfinden, was die Ursache ist, damit ich das Problem beheben kann. Kann jemand vorschlagen, wie ich das machen kann? Soll ich Tomcat profilieren, wenn es den WAR lädt und dort nach Hinweisen sucht? Wenn ja, gibt es irgendwo ein Tutorial, das gut für Anfänger ist?Wie kann ich herausfinden, was mein WAR so lange benötigt, um es auf Tomcat zu implementieren?

Wenn dies wichtig ist, verwendet meine Webanwendung Spring und Hibernate. Mir wurde von einem Kollegen gesagt, dass diese vielleicht die Verlangsamung verursachen, weil sie so riesig sind, dass irgendwo ein Klassenlader an der schieren Anzahl von Klassen, die er laden muss, erstickt.

Auch sehe ich das, wenn ich Tomcat stoppen oder heiß, den Krieg zu einem bereits laufenden Tomcat bereitstellen:

Jun 1, 2012 6:03:33 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc 
SEVERE: The web application [/nacem-rest] registered the JDBC driver [oracle.jdbc.OracleDriver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered. 
Jun 1, 2012 6:03:34 PM org.apache.catalina.startup.HostConfig deployWAR 

Vielleicht ist dies ein Teil des Problems ist? Das erneute Bereitstellen meiner Webanwendung erfordert fast immer auch einen Neustart von Tomcat, und ich habe immer angenommen, dass das oben erwähnte JDBC-Treiberproblem schuld war, aber vielleicht hat es auch etwas mit der trägen Startzeit zu tun?

Ich weiß sehr wenig über diese Art von Sache, so ist dies eine echte Chance zu lernen. Vielen Dank im Voraus für Ihre Hilfe.

Antwort

7

Sie können einen Profiler verwenden, aber es ist ein bisschen ein Overkill. Erstellen Sie stattdessen nur einige Thread-Dumps, während die Anwendung geladen wird. Sie können jstack oder jvisualvm verwenden, viele Ressourcen über das Netz beschreiben, wie dies zu tun ist. Grundsätzlich benötigen Sie eine PID Ihres Tomcat (siehe: jps).

Wenn Sie es schwierig finden, den Thread-Dump zu analysieren, fügen Sie ihn zu Ihrer Frage hinzu. Normalerweise ist es ziemlich einfach, einen Engpass zu finden. Typische Probleme:

  • die Anwendung versucht, eine Ressource aus dem Internet wie XML-Schema
  • viele Klassen auf dem CLASSPATH
  • übermäßigen GC (enable ausführliche gc Protokollierung für alle Fälle)
  • scannen zu holen
  • nicht genügend Arbeitsspeicher (Swapping, siehe iostat/iotop)
3

Sie sollen ein paar Fäden Dumps während des Einsatzes (je mehr, desto besser), und sie analysiert. Suchen Sie nach Blöcken, wartet usw. Thread Dump Analyzer könnte von Nutzen sein.

3

Die erste, die ich aussehen würde ist, wie die CPU oder RAM-Nutzung von Tomcat während Ihrer Anwendung Start durchführen.

Wenn Sie eine Menge CPU-Aktivität und RAM sehen, dann lädt es wahrscheinlich viele Dinge, wie viele Klassen, oder führt eine Art Vorverteilung oder ähnliches durch. In diesem Fall können Thread-Dumps Ihnen sehr helfen, aber auch "lsof" (wenn Ihr Tomcat in einer * nix-Umgebung läuft), um zu sehen, an welchen Dateien gerade gearbeitet wird.

Wenn Sie es jedoch einfach dort sitzen sehen, wartet es wahrscheinlich auf irgendeine Art von Verbindung.

Eine Ursache kann eine DB-Verbindung sein, wie Sie angenommen haben. Die DB ist in der Regel schnell zu beantworten, und ein fehlgeschlagener Versuch, eine Verbindung zu einer Datenbank herzustellen, wird normalerweise irgendwo deutlich protokolliert, aber dennoch könnte es sein.

Eine andere, weniger bekannte Ursache kann eine XML-Validierung sein. Es ist nicht ungewöhnlich, dass eine Webanwendung XML-Daten lädt, und es ist nicht unüblich, einen validierenden Parser zum Laden dieses XML zu verwenden. Der validierende Parser benötigt ein zu validierendes Schema oder eine DTD, und der URL für die Schema/DTD-Datei ist häufig im XML enthalten. Daher werden einige Parser versuchen, die Schemadatei aus dem Internet zu laden, um das XML zu validieren, und das kann eine lange Internetverbindung erfordern. Darüber hinaus werden einige Parser im Stillen fehlschlagen und das XML einfach nicht validieren, wahrscheinlich nach einer ziemlich langen Zeitüberschreitung. Sorry für vage auf "einige Parser" etc .. aber wenn XML-Laden von Bibliotheken innerhalb Ihrer Webanwendung getan wird, könnten sie den JVM XML-Parser, jede mögliche Version von Xerces, jede mögliche Version für JDOM usw. und sogar verwenden Die schlechtesten verschiedenen Bibliotheken verwenden möglicherweise unterschiedliche Parser.

Wenn es jedoch ein Verbindungsproblem ist, ist es einfacher, es zu sehen "netstat -anlp | grep java" (in Ihrem Tomcat ist auf einer * nix-Umgebung, sonst sollte es "netstat -ano" auf Windows) und auf der Suche nach der ausgehenden Verbindung, die Ihr Kater versucht zu machen. Dort können Sie DB-Verbindungen und auch ausgehende (normalerweise http) Verbindungen sehen, die nach Schemas oder anderem Zeug suchen.

4

Wenn Sie Tomcat 7.0.x verwenden, durchsucht es möglicherweise den Klassenpfad, um Anmerkungen zu erkennen. Wenn Sie viele Gläser/Klassen haben, kann dies ein Problem sein.

Wie Simone sagt, ist die Aufnahme und Analyse einiger Thread Dumps ein guter Anfang.

Wenn Sie keine aktuelle Version von Tomcat verwenden, aktualisieren Sie &, indem Sie in der Datei conf/catalina.properties nach Hinweisen suchen, wie die Anzahl der gescannten Gläser reduziert werden kann.

0

Ich habe festgestellt, dass ich bei der Bereitstellung einer Webanwendung auf Tomcat8 eine große Verzögerung hatte. Ich hatte drei Datenbankverbindungspools in meiner context.xml-Datei innerhalb der WAR konfiguriert. Jeder Verbindungspool hatte eine anfängliche Anzahl von 10 Verbindungen, sodass Tomcat beim Start 30 Datenbankverbindungen erstellte. Ich stellte fest, dass die Konfiguration jedes Pools für eine erste Verbindung auf meinem Testsystem die Bereitstellungszeit von ungefähr 3 Minuten auf 22 Sekunden verbesserte.

-3

unter Anfügen in setenv.sh Ihre Arbeit tomcat7/bin Verzeichnis:

JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"

Verwandte Themen