Probleme mit dem Absturz von Anlegestellen

8

Ich habe Probleme mit dem Absturz von Jetty, ich benutze Jetty 6.1.24.

Ich betreibe eine neo4j Spring MVC webapp, Jetty wird für ca. 1 Stunde laufen und dann muss ich Jetty neu starten. Es läuft auf einer kleinen Amazon ec2-Instanz, Debian mit 1,7 GB RAM.

Ich starte Jetty mit java -Xmx900m -server -jar start.jar

Ich verbinde mich mit dem Server mit putty, wenn Jetty abstürzt die Putty Sitzung trennt, kann ich nicht sehen, welcher Fehler es zum Absturz gebracht hat.

Ich würde gerne sehen können, ob es sich um einen Fehler von Spring handelt, ich bin mir nicht sicher, wie ich die Ausgabe von der Spring-App mit Jetty protokollieren kann. Oder wenn es sich um Jetty oder ein Speicherproblem handelt, was wäre der beste Weg, Jetty zu überwachen? Ich kann das nicht auf meinem lokalen Rechner, auf dem Windows läuft, wiederherstellen. Was denkst du wäre der beste Weg, um das zu erreichen? Danke

    
paddydub 21.08.2010, 17:44
quelle

4 Antworten

4

Wenn Sie Absturz sagen, meinen Sie die JVM-Segmentierung und verschwindet? Wenn das der Fall ist, würde ich überprüfen und sicherstellen, dass Sie den verfügbaren Speicher der Maschine nicht erschöpfen. Java auf Linux stürzt ab, wenn der Systemspeicher so niedrig wird, dass die JVM nicht mehr bis zu ihrem maximalen Speicher reservieren kann. Beispiel: Sie haben den maximalen JVM-Speicher auf 500 MB festgelegt, von dem derzeit 250 MB verwendet werden. Das Linux-Betriebssystem hat jedoch nur 128 MB zur Verfügung. Dies führt zu instabilen Ergebnissen und die JVM segfault.

Unter Windows verhält sich die JVM in diesem Szenario besser und gibt OutOfMemoryError aus, wenn das System nicht genügend Arbeitsspeicher zur Verfügung hat.

  1. Überprüfen Sie, wie viel Systemspeicher zum Zeitpunkt Ihrer Abstürze verfügbar ist.
  2. Überprüfen Sie, ob andere Prozesse auf Ihrer Box viel Speicherplatz verbrauchen. Schalten Sie alles aus, was mit der JVM konkurrieren könnte.
  3. Führen Sie jconsole aus und verbinden Sie es mit Ihrer JVM. Das wird Ihnen sagen, wie Speicher in Ihrem JVM-Prozess verwendet wird, und Ihnen eine Historie geben, durch die Sie zurückblicken können, wenn es abstürzt.
  4. Entfernen Sie bei dieser Art von Tests den systemeigenen Code, den Sie möglicherweise in die JVM laden.

Ich glaube, Jetty verfügt über einen systemeigenen Code für die Bearbeitung von Anfragen mit hohem Volumen. Stellen Sie sicher, dass es nicht verwendet wird. Sie wollen die Abstürze auf Java und NICHT auf irgendeine seltsame native lib isolieren. Wenn Sie das native Zeug herausnehmen und finden, dass es funktioniert, haben Sie Ihre Antwort, was es verursacht. Wenn es weiterhin stürzt, könnte es sehr gut sein, was ich beschreibe.

Sie können die JVM zwingen, den gesamten Speicher beim Start mit -Xms900m zuzuweisen, um sicherzustellen, dass die JVM nicht mit anderen Prozessen um Speicher kämpft. Sobald es den vollen Xmx-Betrag zugewiesen hat, wird es nicht abstürzen. Keine Lösung, aber Sie können es leicht auf diese Weise testen.

    
chubbsondubs 25.08.2010, 20:54
quelle
5

Das ist nicht wirklich eine Programmiererfrage; vielleicht wird es zu ServerFault verschoben.

Sie haben nicht ausdrücklich angegeben, welches Betriebssystem Sie verwenden, aber ich riskiere eine Vermutung bei einer Linux-Distribution. Sie haben zwei Möglichkeiten herauszufinden, was falsch ist:

  1. Starten Sie Ihre Sitzung auf dem Bildschirm. Der Bildschirm wird so lange aktiv sein, wie der Computer eingeschaltet ist , bis Sie das Betriebssystem neu starten (oder den Bildschirm beenden).

    Sie starten den Bildschirm wie folgt

    %Vor%

    und Sie erhalten eine neue Eingabeaufforderung, wo Sie Ihr Programm starten können (CD Foo, Jetty, etc). Wenn Sie zufrieden sind und Sie nur irgendwo hin müssen, können Sie den Bildschirm trennen, indem Sie STRG + A und dann STRG + D drücken. Sie werden zu dem Ort zurückkehren, an dem Sie vor dem Aufruf von screen waren.

    Um zurück zum screen zu kommen, geben Sie screen -R ein, was bedeutet, dass Sie einen bestehenden Bildschirm fortsetzen. Sie sollten den Steg wieder sehen.

    Das Schöne ist, dass wenn Sie die Verbindung verlieren (oder Sie Putty durch Zufall oder was auch immer schließen), können Sie screen -list verwenden, um eine Liste der laufenden Bildschirme zu erhalten, und sie dann zwangsweise lösen -D und sie wieder an die current putty -R , kein Schaden angerichtet!

  2. Benutze nohup. Nohup trennt den von Ihnen ausgeführten Prozess mehr oder weniger von der Konsole, sodass keine Ausgabe an das Terminal gesendet wird . Sie starten Ihr Programm normal, aber Sie fügen Ihrem Befehl das Wort nohup hinzu.

    Zum Beispiel:

    %Vor%

    Nachdem ls -l abgeschlossen ist, wird Ihre Ausgabe in nohup.out gespeichert.

mogsie 21.08.2010 18:16
quelle
2

Wenn Sie java starten, leiten Sie beide Ausgaben (stdout und stderr) in eine Datei um:

Verwenden von Bash:

%Vor%

Überprüfen Sie nach dem Absturz diese Dateien.

Wenn der Absturz auf ein Signal zurückzuführen ist (wie SEGV = segmentation fault), sollte es einen Datei-Dump von der JVM an dem Ort geben, an dem Sie java gestartet haben. Für Sun VM (Hotspot) ist es etwas wie hs_err_pid12121.log (hier ist 12121 die Prozess-ID).

    
gawi 26.08.2010 16:22
quelle
1

Wenn Putty STRONGIG trennt, deutet dies darauf hin, dass auf dem Server nicht mehr genügend Arbeitsspeicher verfügbar ist, und beginnt, Prozesse links und rechts herunterzufahren. Es ist wahrscheinlich Ihre Anlegestelle Instanz wird zu groß.

Das Einfachste, was Sie jetzt tun können, ist das Hinzufügen von 1-2 Gb mehr Swap Space und machen Sie es erneut. Beachten Sie auch, dass Sie den jvisualvm verwenden können, um an die Jetty-Instanz anzuhängen, um Laufzeitinformationen direkt zu erhalten.

    
quelle

Tags und Links