CPU auslastung mittels uptime?

Sonic_cgn

mit wenig Erfahrung
Hallo zusammen,

ich habe einen bösen TomCat Prozess der sich alle paar Tage mal vollfrisst.
D.H. er läuft auf 99-100% und lässt sich nur noch mittels "kill -9" stoppen.

Nun dachte ich mir das ich "uptime" dazu verwenden könnte, die durchschnittliche CPU-Auslastung der letzten 5 Minuten mit einem Wert abzugleichen.

Also z.b. CPU > 5.00 ... dann...
Nur wie kann ich das rausfiltern?

So sieht es aus...
Code:
 5:01pm  up 4 days 20:06,  1 user,  load average: 1.48, 1.30, 1.20

Code:
TEST=$(uptime");


if [ -n $TEST < 5.00 ]; then
echo "Alles OK";

else

echo "TOMCAT - WIRD GESTARTET";
fi
Wie kann ich "uptime" so filtern das ich nur noch der zweiten Wert erhalte? Also wie hier im Beispiel "1.30"

Freue mich über Eure Antworten

Cu Sven
 
Last edited by a moderator:

Sonic_cgn

mit wenig Erfahrung
Vielen Dank,
werde ich heute Nacht direkt mal einen Hänger provozieren
und die CPU last der letzten 5 Minuten mit einem Wert vergleichen lassen.

Zum Testen habe ich es mal in eine echo geschrieben und $10 durch $11 ersetzt.

Code:
echo $(uptime | awk '{print $11}'|cut -c 1-4)
Ich hoffe das ich nun durch diesen Workaround meinen Server etwas ausfallsicherer bekomme.

Wär ich von allein nie drauf gekommen.. thx

Cu Sven
 

traced

Registered User
Kein Thema,
allerdings solltest Du bedenken dass nun alles, was Deine Load nach oben treibt, deinen Tomcat neu startet :D

Grüsse,
Basti
 

djrick

Registered User
Vielleicht solltest du dir lieber die Prozessliste anschauen und wenn dort ein Tomcat Prozess über einen Zeitraum Dauerlast erzeugt, diesen killen ODER NOCHT BESSER: Rausfinden warum der Tomcat hängt. Weil kill -9 ist nicht gerade eine sehr freundliche Methode einen Prozess zu beenden. Wenn das mal ins Auge geht kannst du dir ne Menge dabei zerschießen...

P.S.: Das ist mir mal mit einem LDAP Server passiert...
 

Sonic_cgn

mit wenig Erfahrung
Ich bin schon lange auf der Suche nach einer Möglichkeit genau dieses zu tun.

Ich habe nur "1"! Java Prozess und das ist der TomCat.
Das ist ein Horror-CMS was tut und macht was es will.

Ich kenne mich mit TomCat nicht besonders aus. Habe schon Stunden damit verbracht den Fehler zu finden. Nur die Log's erzählen mir nichts.
Bin aber schon lange an dem Punkt das ich mich nicht mehr damit auseinandersetzen will -> ausser ner menge an Zeitverlust bringt mir das nix.

Deshalb beschränke ich mich nur noch darauf das ding am laufen zu halten.. so gut es geht.

Wie gesagt werde ich es heute Nacht mal testen aufs mit dem Fetzen von traced, so klappt wie es mir vorstelle.
Ich habe es schon 100x mit "kill-9" gekillt. ist bisher noch nichts passiert. Deshalb wird es wohl hoffentlich auch noch in Zukunft gut gehn.

Natürlich währe es schön nur den Java Prozess über 5 Minuten zu testen. Weil es ja wirklich sein kann das PHP o.ä. mal abdreht. Halte ich aber für eher unwahrscheinlich.

Wenns da ne Möglichkeit für gibt will ich sie gerne anwenden. Wüsste aber nicht wie, deshalb hatte ich mir die alternative mit dem "uptime" überlegt.


edit: Noch was... gibt es ne alternative zu "kill -9" denn ein TomCat ShutDown bzw. ein normales KILL bringen nichts

Cu Sven
 
Last edited by a moderator:

Huschi

Moderator
Staff member
Das ist ein Horror-CMS was tut und macht was es will.
Ich tippe auf OpenCMS! :D

Deshalb beschränke ich mich nur noch darauf das ding am laufen zu halten.. so gut es geht.
Schon mal eine andere JRE versucht?
So ein Fehler kann auch dort entstehen...

gibt es ne alternative zu "kill -9" denn ein TomCat ShutDown bzw. ein normales KILL bringen nichts
Ja, weil der Thread noch aktiv ist. Daher schaft der Tomcat keinen Shutdown.
Genau dafür gibt es kill -9.
Evtl. könnte der Tomcat-Manager es schaffen wenn Du darin die Webapp neu startest.
Nachteil des Kalt-Restarts: OpenCMS braucht immer einige Sekunden bis Minuten (je nach System und Plugins) um durchzustarten.

huschi.
 

Sonic_cgn

mit wenig Erfahrung
Es ist eine gefummels aus Apache Lenya, Coccon, Lucene usw. usw.
Auf das ähnlich OpenCMS ist... weis ich nicht.

Dort waren einige Kunden drauf, es wurden Kunden gelöscht, es gibt ne versionierung.. Allerdings kommt es hier meiner Meinung nach zu erheblichen Redundanzen. Dort sind jetzt nur doch 3-4 Kunden drauf. Darunter ein Newsportal was derzeit knapp 1000 Artikel drin hat.

Letzten Monat waren es knapp 40.000 Seitenzugriffe. Also nix besonders großes

Durch die Redundanzen ist das Verzeichnis der Dateibasierten DB auf ganze 2.9 GB angewachsen. Den wirklichen Platzbedarf schätze ich auf ca 300-400 MB.

Das Ding ist nur sowas von unübersichtlich das ich angst habe dort was du löschen. Zumal es ein Verzeichnis mit über 10.000 Dateien gibt. Irgendwie wurde da alles rein geschrieben. Die Dateinamen sind natürlich alles im UnixTimeStamp Format.

Wenn kompliziert... dann richtig ;)

Ich habe halt nur angst was zu löschen. Da es jeden Tag News gibt. Kann ich nicht drauf los löschen... Wenn mir ein unerkannter Fehler erst zwei tage später auffällt.... Dann gibts ärger.

Also will ich es versuchen so lange wie möglich mit NeuStarts hinzubekommen.
Wenns läuft dann läuft es relativ mittelschnell.

JRE habe ich 5.5.27 diese mit max. 1024 MB !!! (Weniger oder mehr bringt ihn noch schneller zu absturz)
Mein PHP läuft auch mit 128MB und schmiert NIEMALZ ab.
 

Sonic_cgn

mit wenig Erfahrung
5.5.27 war der TomCat ;)
Es ist Java SE 1.6.0.12.

Jetzt wollte ich das erste meiner beiden Scripts antesten.

Nur leider bin ich auch daran gescheitert.

Filename:/opt/tomcat/bin/cron_test_tomcat.sh
Code:
#bin/bash

TEST=$(ps -e | grep "java");
if [ -n "$TEST" ]; then
echo "Alles OK";
else
echo "TOMCAT - WIRD GESTARTET";
/opt/tomcat/bin/catalina.sh start
fi


sleep 60
/opt/tomcat/bin/cron_test_tomcat.sh
exit 1
Ich weis das ich hier ne EndlosSchleife gebaut habe. Das ist allerdings auch so gewollt.

Zum Ablauf Script soll prüfen ob Java Prozess läuft.. Wenn nicht... Dann starte TOMCAT... Wenn ja IST ALLES OK.
Nach 60 Sekunden soll sich das Script selber neu starten.

Das war's eigentlich schon.
Nur wo ist hier mein Denkfehler. Problem ist das wirklich jedes Script einen eigenen Prozess aufruft und zum Schluss nicht beendet wird. Ich habe sogar ein EXIT 1 dahinter geschrieben.

Macht die Stunde 60 Prozesse und nach 24 Stunden wird wohl die CPU leicht warm.

Ich weis das man das normalerweise mit CronJobs hin bekommt. Habe ich schon breit durchgekaut und bin letztendlich auch zu keinem Result gekommen. Wegen Environment und Export und danach ist es doch nur halb gelaufen.

Deshalb wollte ich nun in der Shell als User Tomcat dieses Script per nohup oder screen laufen lassen.

Ich hoffe mir kann hier jemand weiter helfen...

Cu Sven
 

IngoH

New Member
Hallo Sonic_cgn,

sleep 60
/opt/tomcat/bin/cron_test_tomcat.sh
exit 1
Das gibt doch einen unendlichen Prozessbaum, oder nicht?
Wäre es nicht besser eine while schleife zu verwenden?
Z.B das script einfach so starten und unten den scriptaufruf weglassen:
Code:
while true; do cron_test_script.sh; sleep 60; done
Oder crontab:
*/1 * * * * root /opt/bin/script.sh

Gruß,
Ingo
 
Top