Re: "Out of Memory"
On Wed, 22 Mar 2006, Richard Mittendorfer wrote:
> Den Uebeltaeter konnte ich spaeter durch sysstat Logs ausfindig machen
> -- schadet sicher nicht, sowas oder munin o.ae. laufen zu haben. Hin und
> wieder ein top -bn1 irgendwo hinschreiben tut's genauso.
Das mit dem "top -bn1" hat mich ein wenig inspiriert.
Danke Dir noch dafür...:-)
Dacht' ich mir so - schreib' doch mal was kleines, ekliges in PERL dazu -
weil ich auf einem der Server die ich betreue ein ähnlich gelagertes
Problem beobachte:
== cut ==
#!/usr/bin/perl -w
#
# Läuft als Demon und überprüft die Swap-Auslastung alle 5 Sekunden.
# Ergibt sich ein Delta-Swap, wird die Ausgabe auf den Syslog getriggert.
#
# Voraussetzungen: top und logger sind installiert.
#
use strict;
# Wo liegt der TOP und mit welchem Parameter wird er gerufen?
my $TOP="/usr/bin/top -bn1";
# Wo liegt der Logger und welche Parameter
my $LOGGER="/usr/bin/logger -t SWAPALERT -p user.warning ";
# Wieviele Sekunden liegen zwischen den Messungen?
my $MESSINTERVALL=5;
# Schaltet den Debug-Mode ein und gibt immer
# das Ergebnis der Messung aus.
my $DEBUG=0;
# Dies sind dann die Messresultate, die miteinander
# verglichen werden.
my $newswap=0;
my $oldswap=0;
my $swapuse=-1;
while ( 1 ) {
$oldswap=$swapuse;
# Ermitteln der Messgröße aus top
my $topres=`$TOP`;
my @toparr=split(/\n/, $topres);
my $swapline=(grep(/^Swap:/, @toparr))[0];
$swapuse=(split(/k/, (split(/,/,$swapline))[1]))[0];
# Nun haben wir oldswap aus dem vor-vorhergehenden Schleifenloop
# und einen newswap aus dem aktuellen. Diese beide lassen sich
# trefflich vergleichen
my $newswap=$swapuse;
# Entweder haben wir ein Delta-Swap und geben das Resultat vom
# top auf den Logger oder wir haben einen Debug-Mode und geben dadurch
# das Resultat aus.
if ( (($oldswap>0) && ($oldswap < $newswap)) || $DEBUG ) {
`echo "$topres" | $LOGGER `;
}
# Vermeiden von Memory-Leaks, wenn das mal als Demon läuft.
undef $topres;
undef @toparr;
undef $swapline;
# Schlaf Kindlein schlaf...
sleep $MESSINTERVALL
}
== cut ==
Das Dings mal auf dem Server laufen lassen, indem man es in die
/etc/inittab einträgt:
#
# Memory-Checker - logged die SWAP-Auslastung wenn der Swap wächst.
#
mc:2345:respawn:/usr/local/sbin/checkmem.pl
Vielleicht noch mit logcheck das Pattern /SWAPALERT/ auf einen Alert
laufen lassen und den Prozess killen, bevor er das ganze System in den
Bach reißt.
t++
Reply to: