xref: /dragonfly/test/sysperf/loop900k.c (revision b5daedd44b0cb06b9a9df40d3288467b31d0b5e1)
1 /*
2  * Infinite loop test with 900,000 processes
3  *
4  * Requires system w/ 128GB+ of ram, kern.maxproc=4000000 set in
5  * /boot/loader.conf.  80 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
main(int ac,char ** av)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(80);
65 
66                                         while (1) {
67                                                   ;
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