[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

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: