it-swarm.com.de

Jmap wird ausgeführt Wird Socketdatei kann nicht geöffnet werden

Ich musste jmap ausführen, um einen Heap Dump meines Prozesses zu erstellen. aber jvm wurde zurückgegeben:

Unable to open socket file: target process not responding or HotSpot VM not loaded
The -F option can be used when the target process is not responding

Also habe ich den -F verwendet:

./jmap -F -dump:format=b,file=heap.bin 10330
Attaching to process ID 10331, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 24.51-b03
Dumping heap to heap.bin ...
  1. Die Verwendung von -F ist in Ordnung, um Heap-Dump zu erstellen?
  2. Ich warte 20 Minuten und bin noch nicht fertig. Irgendwelche Ideen warum?
61
rayman

jmap vs. jmap -F sowie jstack vs. jstack -F verwenden völlig unterschiedliche Mechanismen, um mit der Ziel-JVM zu kommunizieren.

jmap/jstack

Bei Ausführung ohne -F verwenden diese Tools Dynamic Attach Mechanism . Dies funktioniert wie folgt.

  1. Vor dem Verbinden mit dem Java-Prozess 1234 erstellt jmap eine Datei .attach_pid1234 im Arbeitsverzeichnis des Zielprozesses oder unter /tmp.

  2. Dann sendet jmapSIGQUIT an den Zielprozess. Wenn die JVM das Signal abfängt und .attach_pid1234 findet, startet sie den AttachListener-Thread.

  3. Der Thread AttachListener erstellt einen UNIX-Domänensocket /tmp/.Java_pid1234, um Befehle von externen Tools anzuhören.

  4. Wenn eine Verbindung (von jmap) akzeptiert wird, überprüft die JVM aus Sicherheitsgründen, dass die Berechtigungsnachweise des Socket-Peers gleich euid und egid des JVM-Prozesses sind. Deshalb funktioniert jmap nicht, wenn sie von einem anderen Benutzer (auch von root) ausgeführt wird.

  5. jmap stellt eine Verbindung zum Socket her und sendet den Befehl dumpheap.

  6. Dieser Befehl wird vom AttachListener-Thread der JVM gelesen und ausgeführt. Alle Ausgaben werden an die Buchse zurückgesendet. Da der Heap-Dump direkt von der JVM erstellt wird, ist der Vorgang sehr schnell. Die JVM kann dies jedoch nur an safepoints durchführen. Wenn ein Sicherungspunkt nicht erreicht werden kann (z. B. wenn der Prozess blockiert ist, nicht reagiert oder ein langer GC ausgeführt wird), wird jmap das Zeitlimit überschreiten und fehlschlagen.

Lassen Sie uns die Vor- und Nachteile von Dynamic Attach zusammenfassen.

Pros.

  • Heap-Dump und andere Vorgänge werden von JVM gemeinsam mit maximaler Geschwindigkeit ausgeführt.
  • Sie können eine beliebige Version von jmap oder jstack verwenden, um eine Verbindung zu einer anderen Version der JVM herzustellen.

Cons.

  • Das Tool sollte von demselben Benutzer (euidegid) wie die Ziel-JVM ausgeführt werden.
  • Kann nur bei lebendiger und gesunder JVM verwendet werden.
  • Funktioniert nicht, wenn die Ziel-JVM mit -XX:+DisableAttachMechanism gestartet wird.

jmap -F/jstack -F

Bei Ausführung mit -F wechseln die Tools in den speziellen Modus, der HotSpot Serviceability Agent enthält. In diesem Modus wird der Zielprozess eingefroren. Die Tools lesen ihren Speicher über OS-Debugging-Funktionen, nämlich ptrace unter Linux.

  1. jmap -F ruft PTRACE_ATTACH in der Ziel-JVM auf. Der Zielprozess wird in Reaktion auf das Signal SIGSTOP unbedingt ausgesetzt.

  2. Das Tool liest den JVM-Speicher mit PTRACE_PEEKDATA. ptrace kann jeweils nur ein Wort lesen. Daher sind zu viele Aufrufe erforderlich, um den großen Heap des Zielprozesses lesen zu können. Das ist sehr und sehr langsam.

  3. Das Tool rekonstruiert die internen Strukturen der JVM basierend auf den Kenntnissen der jeweiligen JVM-Version. Da verschiedene Versionen von JVM ein anderes Speicherlayout haben, funktioniert der -F-Modus nur, wenn jmap aus demselben JDK stammt wie der Ziel-Java-Prozess.

  4. Das Tool erstellt selbst einen Heap-Dump und setzt den Zielprozess dann fort.

_/Pros.

  • Es ist keine Zusammenarbeit von target JVM erforderlich. Kann auch bei einem Hung-Prozess verwendet werden.
  • ptrace funktioniert immer, wenn die Berechtigungen auf Betriebssystemebene ausreichen. Z.B. root kann Prozesse aller anderen Benutzer sichern.

Cons.

  • Sehr langsam für große Haufen.
  • Das Tool und der Zielprozess sollten aus derselben Version von JDK stammen.
  • Der Sicherungspunkt wird nicht garantiert, wenn das Werkzeug im erzwungenen Modus angebracht wird. Obwohl jmap versucht, alle Sonderfälle zu behandeln, kann es vorkommen, dass sich die Ziel-JVM nicht in einem konsistenten Zustand befindet.

Hinweis

Es gibt eine schnellere Methode, Heap-Dumps im Zwangsmodus zu erstellen. Erstellen Sie zuerst einen Coredump mit gcore und führen Sie dann jmap über der generierten Kerndatei aus. Siehe die verwandte Frage .

124
apangin

Ich habe gerade festgestellt, dass jmap (und vermutlich jvisualvm, wenn es zum Erstellen eines Heap-Dumps verwendet wird) erzwingt, dass der Benutzer, der jmap ausführt, derselbe Benutzer sein muss, der den Prozess ausführt, der versucht, ein Dumping durchzuführen.

in meinem Fall wird der jvm, für den ich einen Heap-Dump erstellen möchte, vom Linux-Benutzer "jboss" ausgeführt. Wo Sudo jmap -dump:file.bin <pid> meldete: "Socket konnte nicht geöffnet werden:", konnte ich meinen Heap-Dump mit folgendem Befehl greifen:

Sudo -u jboss jmap -dump:file.bin <pid>
68
ben_wing

Wenn Ihre Anwendung als systemd-Dienst ausgeführt wird, sollten Sie die Dienstdatei öffnen, die unter /usr/lib/systemd/system/ und nach Ihrem Dienstnamen benannt ist. Prüfen Sie dann, ob das Attribut privateTmp wahr ist.

Wenn dies zutrifft, ändern Sie den Wert in false. Aktualisieren Sie den Dienst dann wie folgt mit dem Befehl: systemctl daemon-reload systemctl restart [servicename] Wenn Sie jmap/jcmd vor dem Neustart ausführen möchten, können Sie das Skript execStop in der Servicedatei verwenden. Geben Sie einfach den Befehl ein und führen Sie systemctl stop [service name] aus.

0
Simple

So wie ben_wing gesagt, können Sie mit:

Sudo -u jboss-as jmap -dump:file.bin <pid>

(In meinem Fall ist der Benutzer jboss-as, aber Sie könnten jboss oder eine andere sein.)

Aber es war nicht genug, weil er bat mich um ein Passwort ([Sudo] password for ec2-user:), obwohl ich Sudo ausführen konnte, ohne mich mit anderen Befehlen nach einem Passwort zu fragen. 

Ich habe die Lösung hier gefunden, und ich musste nur noch eine Sudo hinzufügen:

Sudo sudo -u jboss-as jmap -dump:file.bin <pid>

Es funktioniert auch mit anderen Befehlen wie jcmd und jinfo.

0