Hoher Load

FreeBSD, Gentoo, openSUSE, CentOS, Ubuntu, Debian
audio07
Posts: 64
Joined: 2003-12-03 02:32
Location: Mainz
 

Hoher Load

Post 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.
User avatar
Joe User
Project Manager
Project Manager
Posts: 11190
Joined: 2003-02-27 01:00
Location: Hamburg
 

Re: Hoher Load

Post 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.
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
braindead
Posts: 250
Joined: 2002-10-22 09:49
Location: vorm Rechner
 

Re: Hoher Load

Post 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.
audio07
Posts: 64
Joined: 2003-12-03 02:32
Location: Mainz
 

Re: Hoher Load

Post 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).
audio07
Posts: 64
Joined: 2003-12-03 02:32
Location: Mainz
 

Re: Hoher Load

Post 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...
User avatar
daemotron
Administrator
Administrator
Posts: 2643
Joined: 2004-01-21 17:44
 

Re: Hoher Load

Post 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>
User avatar
Joe User
Project Manager
Project Manager
Posts: 11190
Joined: 2003-02-27 01:00
Location: Hamburg
 

Re: Hoher Load

Post 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 ;)
PayPal.Me/JoeUserFreeBSD Remote Installation
Wings for LifeWings for Life World Run

„If there’s more than one possible outcome of a job or task, and one
of those outcomes will result in disaster or an undesirable consequence,
then somebody will do it that way.“ -- Edward Aloysius Murphy Jr.
make_root
Posts: 23
Joined: 2007-06-14 04:12
 

Re: Hoher Load

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