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

Re: Rechner töten



Gruesse!
* Wolf Wiegand <wolf@kondancemilch.de> schrieb am [30.03.05 22:32]:

> Ich habe jetzt mal ein Beispiel aus meinem schlauen Buch dementsprechend 
> etwas angepasst. Simulierte zumindest bei mir einen Runaway-Process, der 
> nach und nach den Speicher füllt und hübsche Load verursacht. Was am 
> Ende passiert, wollte ich dann doch nicht mehr probieren...:

Ich schon! Aber ich habe das Gefühl das dein Source irgendwie nicht
wesentlich Speicher verbraucht. Soweit ich C verstehe reservierst du
doch mit deinem malloc 1024 byte. Mit dem sprintf belegst du aber
jedesmal nur das, was "touched" an bytes hat. Oder täusche ich mich da?

Jedenfalls hat es (mit und ohne ! bei fork) massivst Load verursacht.
Bevor der Watchdog zuschlug hatte ich so 430/370/250 ;-)
Mußte allerdings die Load-Überwachung des Watchdogs abschalten, da diese
wesentlich früher zuschlug.

Allerdings war IMHO das System aufgrund der Belastung mehr damit
beschäfigt, zwischen den einzelnen Prozessen zu switchen als das jeder
Prozess "arbeiten" konnte.

Auch kam das Programm nie aus der ersten while-Schleife raus, die
Ausgabe vom Speicherzähler habe ich nie gesehen.

> #include <unistd.h>
> #include <stdlib.h>
> #include <stdio.h>
> 
> #define ONE_K (1024)
> 
> int main(){
>         char *some_memory;
>         int size_to_allocate = ONE_K;
>         int megs_obtained = 0;
>         int ks_obtained = 0;
> 
>         while(1){
>                 for (ks_obtained =0; ks_obtained < 1024; ks_obtained++){
>                         some_memory = (char *)malloc(size_to_allocate);
>                         if (some_memory == NULL) exit(EXIT_FAILURE);
>                         sprintf(some_memory, "touched");
>                         // send child to a dead end sleep
>                         if (!fork()) for(;;) ;
>                 }
>                 megs_obtained++;
>                 printf("Now allocated %d Megabytes\n", megs_obtained);
>         }
>         exit(EXIT_SUCCESS);
> }
> 
> Und dann eventuell mal das ! vor dem fork() entfernen.

Ich habe meinen Versuch jetzt mal so abgeändert:

int main(int argc, char *argv[])
{
  unsigned int i;
  long siz;
  char* p;
  
  siz = atoi(argv[1]);
   
  fprintf(stdout, "Allokiere Speicher: %d\n", siz);
  p = (char *)malloc(siz);
  if (p == NULL)
     return EXIT_FAILURE;

  printf("Schreibe in Speicherbereich\n);
  for (i=0; i<siz; i++) {
     p[i] = 65;
  }
  printf("Gebe Speicher nicht wieder frei.\n");
  //free(p); 
  while(1) {
     sleep(10);
     fork();
  }

  return EXIT_SUCCESS;
}

Als Argument übergebe ich knapp die Byteanzahl, die free -b als frei
anzeigt.

Dadurch wird per Prozess logischerweise wesentlich mehr Speicher
allokiert, der Kernel killt überflüssige Prozesse, das System selbst ist
kaum ansprechbar. Irgendwann schlägt der Watchdog zu: entweder weil eine
bestimmte Datei in einem bestimmten zeitraum nicht geändert wurde oder
weil der process table voll ist.

So abschließend kann ich jedenfalls sagen, das der Software-Watchdog
eigentlich gut funktioniert. Zumindest was ein instabliles System durch
die Software-Seite betrifft. Bei evtl. hardwareseitig bedingten
ABstürzen an dem betroffenen Rechner muß ich halt mal abwarten.

> hth, Wolf

Gruß
	Gerhard

-- 
It's nice to be important...
but it's more important to be nice.



Reply to: