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.
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.