2016-07-20 42 views
0

Wir haben WebSphere-Umgebung mit 2 Knoten-Agenten und 4 Application Server. Bei hohem Datenaufkommen reagiert einer der Anwendungsserver nicht mehr auf Anforderungen, da er auf die maximale Threadanzahl des Web-Containers springt.
Beim Analysieren des Thread-Dumps haben wir festgestellt, dass sich ca. 60% der Threads im Runnable-Zustand befinden und jeweils 20% des Status Wait und Parked aufweisen.
Wir sehen keine Deadlock-Warnung im Thread-Dump. Auf genaues Hinsehen haben wir festgestellt, dass eine des Web-Container-Thread die Sperre mit folgenden Meldung besitzt:WebSphere Web Container Threads mit maximalen Thread-Status in runnable

Owns Monitor Lock on com/ibm/ws/classloader/[email protected] 

Könnte jemand mit dem Verständnis der oben genannten Fehler helfen und seiner Auflösung?

+0

Fehler in Websphere-Protokollen? –

+0

könnten Sie mehr Daten wie ffdc Fehler bereitstellen. –

+0

In den Protokollen sehen wir ein Problem oder Skalierbarkeitsproblem mit der Datenbankinstanz. Bei hohem Datenaufkommen erhöhen sich die Antwortzeiten der Datenbank, beispielsweise von 1 Sekunde auf 5 Sekunden. Die unmittelbare Interpretation war, dass wir an der Datenbank erstickten, die langsam und schließlich den App-Server zu seiner maximalen Kapazität brachte. Wir haben die Ressourcen am Ende der Datenbank verdoppelt, aber das Problem besteht immer noch. Jetzt sehen wir den obigen Fehler in Thread-Dump-Protokollen. –

Antwort

1

Es ist wichtig, sich die Stack-Ablaufverfolgung des Threads anzusehen, der die Sperre besitzt, und dann die Stack-Ablaufverfolgung aller anderen Threads zu betrachten, die auf diese Sperre warten. Für ExtJarClassLoader bedeutet das fast sicher, dass alle Threads versuchen, loadClass-Operationen durchzuführen. Wenn viele Threads dies versuchen und blockiert werden, bedeutet dies normalerweise, dass der Ausführungscode eine fehlgeschlagene loadClass-Operation versucht, die ClassNotFoundException abfängt und fortfährt. Das Erstellen und Werfen von ClassNotFoundException ist teuer, daher sollte der Code normalerweise so geändert werden, dass das Gesamtergebnis zwischengespeichert wird (z. B. wenn eine Sequenz von Klassenladevorgängen versucht wird, sollte das positive/negative Ergebnis irgendwie zwischengespeichert werden). Dies wird natürlich kompliziert, wenn der Code, der loadClass aufruft, eine Bibliothek eines Dritten ist.

+0

Wenn mehr Hilfe benötigt wird, komprimieren Sie alle Javacore-Dateien in eine Zip-Datei und laden Sie sie auf https://wait.ibm.com/ hoch Thread-Dumps und berichten, wo die Anwendung Engpass ist. –