On Thu, Jul 09, 2015 at 01:36:23PM -0400, Steve Litt wrote:
> By the way, I have no personal knowledge of how many actor sockets a
> listener socket can spawn off, but if I had to guess, I'd imagine 50
> would be way too low a number, if for no other reason than none of my
> current and former ISPs would have been able to serve httpd to the
> masses if 50 was the limit.
> 
> Hmmm, as far as just plain processes, maybe I'll make a fork bomb and
> see how many there are before the system bogs down. That should be
> interesting.

Here's a trivial forkbomb-ish program that I've used for some experiments.
(So as to recover safely, when fork() finally fails it will sleep briefly
and exit.)
It's probably not representative of even a trivial server, but on my 
1GB N270 netbook running Alpine Linux, with ~100 programs running
(ls -d /proc/[0-9]*|wc -l = 103), it reports 7880 forks.

Thanks,
Isaac Dunham
/* Written by Isaac Dunham in the year of our Lord 2015
 * No rights reserved, all warranties disclaimed.
 * (You can do whatever you want, but entirely at your own risk.)
 *
 * A small forkbomb-ish test program intended to test how many trivial
 * socket-using programs can run on a processor (and their effects on
 * the scheduler).
 * It gets a pair of connected sockets and repeatedly forks, with
 * the main process reading from the socket and the children
 * writing to it.
 * On resource exhaustion, all processes will sleep for 20 seconds
 * and exit, allowing you to briefly observe practical effects
 * before the system recovers.
 *
 * Compile with -DUSLEEP if you would rather see effects of a *lot* of
 * syscalls. (For example, what does the scheduler do?)
 */

#include <sys/types.h>
#include <sys/socket.h>
#include <stdio.h>
#include <unistd.h>


int main(int argc, char *argv)
{
        pid_t pid;
        int count, sv[2];
        char got;

        if (socketpair(AF_UNIX, SOCK_STREAM, 0, sv))
                return 32;

        while ((pid = fork()) > 0) {
                count += (read(sv[1], &got, 1) > 0 )? 1: 0 ;
                printf("pid: %lld forks: %d\n", (long long)pid, count);
        }
        if (!pid) {
                write(sv[0], "a", 1);
        }
#ifdef USLEEP
        count = 0;
        while (count < 20000) {
                usleep(1000);
                count ++;
        }
#else
        sleep(20);
#endif
        return 0;
}
_______________________________________________
Dng mailing list
Dng@lists.dyne.org
https://mailinglists.dyne.org/cgi-bin/mailman/listinfo/dng

Reply via email to