Page 1 of 1
Hoher Load
Posted: 2008-04-03 13:46
by audio07
Seit einigen Wochen habe ich das Problem, dass es 2-3 mal vorkam, dass mein Server plötzlich nicht mehr erreichbar ist. D.h. er ist noch pingbar, aber sämtliche Dienste stehen nicht mehr zur Verfügung. Aus diesem Grund habe ich vor kurzem ein ganz einfaches LOAD-Monitoring implementiert, welches alle 30s den Load des Servers in eine Datei schreibt. Also ganz simpel.
Nachdem das besagte Problem heute wieder auftrat, habe mir das Log dann mal angeschaut:
Thu Apr 3 11:57:39 2008 => 0.24 0.30 0.30 2/255 12575
Thu Apr 3 11:58:09 2008 => 0.26 0.30 0.30 2/274 12697
Thu Apr 3 11:58:40 2008 => 8.60 2.26 0.95 1/367 13078
Thu Apr 3 11:59:11 2008 => 22.13 6.15 2.29 1/409 13271
Thu Apr 3 11:59:47 2008 => 35.13 11.65 4.31 5/414 13346
Thu Apr 3 12:00:27 2008 => 44.38 16.80 6.34 50/449 13442
Irgendein Programm scheint also amok zu laufen. Nun meine Frage, bevor ich mich hinsetze und evtl. selbst das Rad in Form von einem Script neu erfinde: fallen euch spontan Lösungen (Programme/Scripte) ein, mit dem ich den Load überwachen - und ggf. den auslösenden Task beenden und neu starten kann?
Das damit das Problem an sich nicht gelöst ist, ist mir klar, jedoch würde dies die Problematik etwas entschärfen, bis ich den eigentlichen Fehler gefunden habe.
Re: Hoher Load
Posted: 2008-04-03 14:13
by Joe User
Es ist kein einzelner Prozess/Thread, sondern mehrere dutzend. Demnach tippe ich spontan auf Apache, genauer ein Apache-Modul. Vermutlich ein fehlerhaftes PHP/Python/Perl/Ruby-Script. Als erstes bitte das komplette System und danach alle WebApps auf den aktuellen Stand bringen und bei erneutem Auftreten des Problems ein "ps auxf" durchführen und den/die Prozess(e)/Thread(s) identifizieren.
Re: Hoher Load
Posted: 2008-04-03 14:20
by braindead
Also ein Script das den load überwacht kenne ich jetzt auch nicht, aber wenn du was neustarten willst solltest du ja erstmal wissen was. Schreib dir doch mal ein kleines Script das wenn der load größer 10 ist sich die CPU Fresser (es müssen ja mehr als einer sein) anzeigen lässt und die dann in eine Datei schreibt. Dann weißt du wenigstens schonmal was die Kopfschmerzen macht.
Re: Hoher Load
Posted: 2008-04-03 14:30
by audio07
Das System ist, mitsamt allen Diensten + Libs etc, auf dem neusten Stand. Das mit den Webapps ist nicht so einfach, da dort diverse Kunden ihre Sachen selbst hochladen. Ich habe auch spontan an Apache gedacht, jedoch gibt es auch andere Dienste, die im laufenden Betrieb viele Prozesse/Threads gestartet haben (mysql, postfix, courier-imap/pop3).
Re: Hoher Load
Posted: 2008-04-03 14:32
by audio07
braindead wrote:Also ein Script das den load überwacht kenne ich jetzt auch nicht, aber wenn du was neustarten willst solltest du ja erstmal wissen was. Schreib dir doch mal ein kleines Script das wenn der load größer 10 ist sich die CPU Fresser (es müssen ja mehr als einer sein) anzeigen lässt und die dann in eine Datei schreibt. Dann weißt du wenigstens schonmal was die Kopfschmerzen macht.
Ja an sowas hatte ich auch gedacht. Hätte nur sein können, dass es da was Fertiges gibt, welches vielleicht noch umfangreichere Features hat. Naja dann schreib ich mal schnell mein 20-Perl-Zeiler runter...
Re: Hoher Load
Posted: 2008-04-03 15:47
by daemotron
<nitpick-mode>
Der Load Avg. leitet sich nur aus der Anzahl der Prozesse, nicht aus der Anzahl Threads ab. Von daher kannst Du MySQL schon mal ausschließen - allerdings nicht unbedingt als Ursache; könnte ja sein, dass der mysqld irgendeine Ressource blockiert, auf die andere Prozesse dann warten
</nitpick-mode>
Re: Hoher Load
Posted: 2008-04-03 16:08
by Joe User
jfreund wrote:Der Load Avg. leitet sich nur aus der Anzahl der Prozesse, nicht aus der Anzahl Threads ab.
Das trifft mindestens auf Systeme mit NPTL nicht zu. Per "top [-H]" einfach zu sehen ;)
Re: Hoher Load
Posted: 2008-04-17 04:17
by make_root
Ein wirklich ganz einfaches Script, wie ich es mir gebaut habe…
Code: Select all
#!/bin/sh
### Konstanten:
myDate=$(date)
today=$(date +%d)
yesterday=$(date --date=-1day +%d)
Email_To=an@mich.de
Email_From=ServerStatus@meineDomain.de
# Hier werden aus anderen Scripts tgl. selbst erzeugte Logs abgelegt
StatusDir=/var/log/checkLogs
###########################################################################
### Load-Check auf den 5min Wert - lass mich vom 1min Wert nicht stressen ;-)
#Email Sub für diesen Check
Email_Sub="Load: $(uptime | awk '{ print $(NF-2),$(NF-1),$NF }') "
# Hole das aktuelle Check-Log
UptimeFile=$StatusDir/uptimeStatus_Day__$today.log
# Isoliere den 5min Wert vor dem Komma
# ... damit ist bei einem !=0 die Last recht hoch
myLoad5=$(uptime | awk -F, '{ print$(NF-1) }' | awk -F. '{ print $1 }' | awk '{ print $1 }')
# Tempdatei, welche in die Email geschrieben wird
myEmailFile=$StatusDir/StatEmail.tmp
if [ "$myLoad5" != "0" ]
then
# Die letzten Eintragungen aus dem UptimeFile in die Email packen
echo "
*Auszug aus $UptimeFile* " > $myEmailFile
tac < $UptimeFile | head -n30 >> $myEmailFile
### Hier kommen dann alle weiteren Ausgaben, die man will/braucht...
#
echo "
*Ausgabe von: ps auxf* " >> $myEmailFile
ps auxf >> $myEmailFile
#
echo "
*Ausgabe von: netstat -tupa* " >> $myEmailFile
netstat -tupa >> $myEmailFile
# Dann die Email mit allem raus senden
>&1 | mail -r $Email_From -q $myEmailFile -s "$Email_Sub" $Email_To
# Und noch das TempFile löschen
rm $myEmailFile
fi
Das kann man leicht den eigenen Wünschen anpassen. Ob und wie man eigene CeckLogs hat/will liegt bei jedem selbst, wie auch was man da rein packt.