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.