Gruesse!
* Wolf Wiegand <[EMAIL PROTECTED]> 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.

Antwort per Email an