Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 10 Mar 2000 02:47:19 GMT
From:      lists@efinley.com (Elliot Finley)
To:        freebsd-questions@FreeBSD.ORG
Subject:   Code that crashes 3.4-Stable
Message-ID:  <38c85e65.27328632@mail.afnetinc.com>

next in thread | raw e-mail | index | archive | help
I'm in the process of stress testing a system for a program that I'm
writing.  This program will be starting lots of processes, so I wrote
a short bit a code to test this out.

The machine is 3.4-stable as of a couple of days ago, PII-350 384M
RAM, and 500M swap.  The kernel has MAXUSERS 512, which should give us
about 8200 process slots.  After forking approx. 5100 children
processes, the machine runs out of RAM, and starts using swap, after
about 64K of swap is used (as shown by top), the machine freezes
solid.  No core, no logged messages, no socket activity, no messages
on console, nothing.

If someone can see a problem with the code, I would appreciate some
pointers.  But even if there IS a problem...  You shouldn't be able to
crash the system with a user program running with no privileges.

If I take out the 'sleep(30)' from the child process, then this
program runs fine, even with the loop counter set to 100,000 (one
hundred thousand), because the child processes go away fast enough
that I can only get about 400 of them running at any one time.  The
problem seems to be when the machine runs out of memory, and starts to
swap.

Here is the code, it was compiled with 'g++ -o test test.c'
-----------------------------------------------------------

#include <iostream.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <signal.h>
#include <unistd.h>
//#include <stdlib.h>

void sig_child(int i)
{
  int pid;
  int status;

  while ( (pid =3D wait3(&status, WNOHANG, (struct rusage *) 0)) > 0) ;
}

main()
{
  cout << "Hello World!" << endl;

  void sig_child(int i);

  signal(SIGCHLD, sig_child);

  int iIsParent;

  for(int i =3D 0; i < 8000; i++) {
      iIsParent =3D fork();
      if(iIsParent < 0) { cout << "Error Forking!" << endl; }
      if(!iIsParent) {
        cout << "I'm child #" << i << endl;
        sleep(30);
        return 0;
      }
  }

  sleep(10);
  cout << "Parent done." << endl;
  return 0;
}

--=20
Elliot (efinley@efinley.com) Weird Science!


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?38c85e65.27328632>