1 /* 2 * Infinite sleep test with 900,000 processes (1/10 second loop) 3 * 4 * Requires system w/ 128GB+ of ram, kern.maxproc=4000000 set in 5 * /boot/loader.conf. 60 second stabilization time after last 6 * process is forked. 7 * 8 * Also test tear-down by ^C'ing the test. 9 */ 10 #include <sys/types.h> 11 #include <sys/wait.h> 12 #include <sys/mman.h> 13 #include <sys/resource.h> 14 #include <errno.h> 15 #include <stdio.h> 16 #include <stdlib.h> 17 #include <unistd.h> 18 #include <string.h> 19 #include <signal.h> 20 21 #define COUNT 900000 22 23 int 24 main(int ac, char **av) 25 { 26 int status; 27 int i; 28 int j; 29 int idno; 30 char *path; 31 char *id; 32 char c; 33 34 if (ac == 1) { 35 for (i = 0; i < COUNT; i += 100) { 36 #if 0 37 asprintf(&path, "cp %s /tmp/x%06d", av[0], i); 38 system(path); 39 free(path); 40 asprintf(&path, "/tmp/x%06d", i); 41 #else 42 asprintf(&path, "%s", av[0]); 43 #endif 44 asprintf(&id, "%d", i); 45 if (vfork() == 0) { 46 execl(path, path, id, NULL); 47 _exit(0); 48 } 49 if (i % 1000 == 0) { 50 printf("running %d\r", i); 51 fflush(stdout); 52 } 53 free(path); 54 free(id); 55 } 56 } else { 57 idno = strtol(av[1], NULL, 0); 58 setpriority(PRIO_PROCESS, 0, 5); 59 for (j = 0; j < 100; ++j) { 60 if (j == 99 || fork() == 0) { 61 int dummy = 0; 62 63 setpriority(PRIO_PROCESS, 0, 15); 64 sleep(60); 65 66 while (1) { 67 umtx_sleep(&dummy, 0, 100000); 68 } 69 _exit(0); 70 } 71 } 72 while (wait3(NULL, 0, NULL) >= 0 || errno == EINTR) 73 ; 74 _exit(0); 75 } 76 printf("running %d\n", i); 77 for (;;) { 78 sleep(1); 79 } 80 return 0; 81 } 82