JVM hängt sich regelmäßig ab

8

Der Versuch, eine sich schlecht benehmende Java VM zu debuggen. Bei dem fraglichen Prozess handelt es sich um eine große VM (100 GB-Heap), auf der Sun VM 1.6u24 auf Centos 5 ausgeführt wird, die routinemäßige Back-End-Aufgaben ausführt - z. B. Datenbankzugriff, Datei-E / A usw.

Nachdem der Prozess für eine Softwareversionsaktualisierung neu gestartet wurde, haben wir festgestellt, dass der Durchsatz erheblich gesunken ist. Die meiste Zeit berichtet top, dass der Java-Prozess 2 Kerne vollständig nutzt. Während dieser Zeit ist die VM völlig unverantwortlich: Es werden keine Protokolle geschrieben, und sie reagiert nicht auf externe Tools wie jstack oder kill -3. Sobald die VM wiederhergestellt ist, wird der Prozess normal fortgesetzt, bis zum nächsten Hang.

strace zeigt an, dass während dieser Verzögerungen nur zwei Threads Systemaufrufe ausführen. Dies waren die VM-Threads "VM Thread" (21776) und "VM Periodic Task Thread" (21786). Vermutlich verbrauchen diese 2 Threads die CPU-Zeit. Die Anwendungs-Threads wachen gelegentlich auf und erledigen ihre Arbeit. Der Rest der Zeit scheinen sie auf verschiedene Futexes zu warten. Übrigens ist die erste Zeile der normalen Phase immer ein SIGSEGV.

%Vor%

Das Problem manifestiert sich in 2 verschiedenen Servern. Rollback unserer Code-Version funktionierte nur für einen der 2 Server. In Systemprotokollen wurden keine Fehlermeldungen gemeldet, und ein anderer Java-Prozess auf der betroffenen Maschine verhält sich ordnungsgemäß.

Diese folgende Ausgabe wurde mit gstack erhalten und zeigt zwei typische wartende Anwendungsthreads:

%Vor%

Wir haben Probleme mit NTPD untersucht, einschließlich der Fehler in der Schaltsekunde, aber die vorgeschlagenen Problemumgehungen haben nicht geholfen, auch nicht die Verwendung externer NTPD-Server. Der Neustart der Maschine selbst hat auch nicht geholfen. Wir haben die GC-Protokollierung aktiviert und es sieht nicht wie ein GC-Problem aus, da keine Nachrichten darauf hinweisen. Auf der Suche nach Vorschlägen, die mit diesem Problem helfen können, wird jede Hilfe sehr geschätzt.

    
Alon Pilberg 28.05.2013, 15:45
quelle

1 Antwort

3

Hier sind ein paar Dinge, die ich mir ansehen würde:

  • Wenn die JVM nicht mehr reagiert, verwenden Sie iostat und vmstat , um zu sehen, ob das System sich überschlägt. Dies kann passieren, wenn Sie Speicher zu viel Speicherplatz zuweisen; Ihr gesamtes System verwendet wesentlich mehr virtuellen Speicher als physischer Speicher.

  • Aktivieren Sie die GC-Protokollierung der JVM, und prüfen Sie, ob eine Korrelation zwischen der nicht reagierenden JVM und GC-Läufen besteht.

Stephen C 28.05.2013 16:17
quelle

Tags und Links