1*af198995SDavid du Colombier /*
2*af198995SDavid du Colombier * Program to cause a synthesized load for profiling.
3*af198995SDavid du Colombier * Spawns n processes each of which would do r rounds of
4*af198995SDavid du Colombier * io + compute.
5*af198995SDavid du Colombier */
6*af198995SDavid du Colombier
7*af198995SDavid du Colombier #include <u.h>
8*af198995SDavid du Colombier #include <libc.h>
9*af198995SDavid du Colombier
10*af198995SDavid du Colombier enum
11*af198995SDavid du Colombier {
12*af198995SDavid du Colombier Nprocs = 10,
13*af198995SDavid du Colombier Nrounds = 4,
14*af198995SDavid du Colombier Ncpu = 10000,
15*af198995SDavid du Colombier Nio = 10000,
16*af198995SDavid du Colombier Nstack = 10,
17*af198995SDavid du Colombier Nsleep = 10,
18*af198995SDavid du Colombier Bufsz = 1024,
19*af198995SDavid du Colombier };
20*af198995SDavid du Colombier
21*af198995SDavid du Colombier #include "rnd.c"
22*af198995SDavid du Colombier
23*af198995SDavid du Colombier int nprocs, nrounds, ncpu, nio, nstack, nsleep;
24*af198995SDavid du Colombier
25*af198995SDavid du Colombier
26*af198995SDavid du Colombier static void
docpu(void)27*af198995SDavid du Colombier docpu(void)
28*af198995SDavid du Colombier {
29*af198995SDavid du Colombier int *dv;
30*af198995SDavid du Colombier int i, j, x;
31*af198995SDavid du Colombier
32*af198995SDavid du Colombier dv = malloc(sizeof vals);
33*af198995SDavid du Colombier for(i = 0; i < nelem(vals); i++)
34*af198995SDavid du Colombier dv[i] = vals[i];
35*af198995SDavid du Colombier for(i = 0; i < nelem(dv); i++)
36*af198995SDavid du Colombier for(j = i; j < nelem(dv); j++)
37*af198995SDavid du Colombier if(dv[i] > dv[j]){
38*af198995SDavid du Colombier x = dv[i];
39*af198995SDavid du Colombier dv[i] = dv[j];
40*af198995SDavid du Colombier dv[j] = x;
41*af198995SDavid du Colombier }
42*af198995SDavid du Colombier free(dv);
43*af198995SDavid du Colombier }
44*af198995SDavid du Colombier
45*af198995SDavid du Colombier static void
doio(char buf[],int sz)46*af198995SDavid du Colombier doio(char buf[], int sz)
47*af198995SDavid du Colombier {
48*af198995SDavid du Colombier int i, p[2];
49*af198995SDavid du Colombier long n;
50*af198995SDavid du Colombier
51*af198995SDavid du Colombier if(pipe(p) < 0)
52*af198995SDavid du Colombier sysfatal("pipe");
53*af198995SDavid du Colombier switch(fork()){
54*af198995SDavid du Colombier case -1:
55*af198995SDavid du Colombier sysfatal("fork: %r");
56*af198995SDavid du Colombier case 0:
57*af198995SDavid du Colombier close(p[1]);
58*af198995SDavid du Colombier for(i = 0; i < nio; i++){
59*af198995SDavid du Colombier n = readn(p[0], buf, sz);
60*af198995SDavid du Colombier if(n != sz)
61*af198995SDavid du Colombier sysfatal("read: %r");
62*af198995SDavid du Colombier }
63*af198995SDavid du Colombier close(p[0]);
64*af198995SDavid du Colombier exits(nil);
65*af198995SDavid du Colombier default:
66*af198995SDavid du Colombier close(p[0]);
67*af198995SDavid du Colombier for(i = 0; i < nio; i++){
68*af198995SDavid du Colombier n = write(p[1], buf, sz);
69*af198995SDavid du Colombier if(n != sz)
70*af198995SDavid du Colombier sysfatal("write: %r");
71*af198995SDavid du Colombier }
72*af198995SDavid du Colombier close(p[1]);
73*af198995SDavid du Colombier waitpid();
74*af198995SDavid du Colombier }
75*af198995SDavid du Colombier }
76*af198995SDavid du Colombier
77*af198995SDavid du Colombier static void
stk(int lvl)78*af198995SDavid du Colombier stk(int lvl)
79*af198995SDavid du Colombier {
80*af198995SDavid du Colombier int i, c;
81*af198995SDavid du Colombier char buf[Bufsz];
82*af198995SDavid du Colombier
83*af198995SDavid du Colombier if(lvl < Nstack){
84*af198995SDavid du Colombier stk(lvl+1);
85*af198995SDavid du Colombier return;
86*af198995SDavid du Colombier }
87*af198995SDavid du Colombier for(i = 0; i <nrounds; i++){
88*af198995SDavid du Colombier for(c = 0; c < ncpu; c++)
89*af198995SDavid du Colombier docpu();
90*af198995SDavid du Colombier doio(buf, sizeof buf);
91*af198995SDavid du Colombier sleep(nsleep);
92*af198995SDavid du Colombier }
93*af198995SDavid du Colombier }
94*af198995SDavid du Colombier
95*af198995SDavid du Colombier static void
usage(void)96*af198995SDavid du Colombier usage(void)
97*af198995SDavid du Colombier {
98*af198995SDavid du Colombier fprint(2, "usage: %s [-p procs] [-r nrounds] [-c ncpu]"
99*af198995SDavid du Colombier " [-i nio] [-s nstack]\n", argv0);
100*af198995SDavid du Colombier exits("usage");
101*af198995SDavid du Colombier }
102*af198995SDavid du Colombier
103*af198995SDavid du Colombier void
main(int argc,char * argv[])104*af198995SDavid du Colombier main(int argc, char *argv[])
105*af198995SDavid du Colombier {
106*af198995SDavid du Colombier int p;
107*af198995SDavid du Colombier
108*af198995SDavid du Colombier nprocs = Nprocs;
109*af198995SDavid du Colombier nrounds = Nrounds;
110*af198995SDavid du Colombier ncpu = Ncpu;
111*af198995SDavid du Colombier nio = Nio;
112*af198995SDavid du Colombier nstack = Nstack;
113*af198995SDavid du Colombier nsleep = Nsleep;
114*af198995SDavid du Colombier ARGBEGIN{
115*af198995SDavid du Colombier case 'p':
116*af198995SDavid du Colombier nprocs = atoi(EARGF(usage()));
117*af198995SDavid du Colombier break;
118*af198995SDavid du Colombier case 'r':
119*af198995SDavid du Colombier nrounds = atoi(EARGF(usage()));
120*af198995SDavid du Colombier break;
121*af198995SDavid du Colombier case 'c':
122*af198995SDavid du Colombier ncpu = atoi(EARGF(usage()));
123*af198995SDavid du Colombier break;
124*af198995SDavid du Colombier case 'i':
125*af198995SDavid du Colombier nio = atoi(EARGF(usage()));
126*af198995SDavid du Colombier break;
127*af198995SDavid du Colombier case 's':
128*af198995SDavid du Colombier nstack = atoi(EARGF(usage()));
129*af198995SDavid du Colombier break;
130*af198995SDavid du Colombier case 'w':
131*af198995SDavid du Colombier nsleep = atoi(EARGF(usage()));
132*af198995SDavid du Colombier break;
133*af198995SDavid du Colombier default:
134*af198995SDavid du Colombier usage();
135*af198995SDavid du Colombier }ARGEND
136*af198995SDavid du Colombier
137*af198995SDavid du Colombier if(nprocs < 2)
138*af198995SDavid du Colombier nprocs = 2;
139*af198995SDavid du Colombier for(p = 0; p < nprocs/2; p++){
140*af198995SDavid du Colombier switch(fork()){
141*af198995SDavid du Colombier case -1:
142*af198995SDavid du Colombier sysfatal("fork: %r");
143*af198995SDavid du Colombier case 0:
144*af198995SDavid du Colombier stk(0);
145*af198995SDavid du Colombier exits(nil);
146*af198995SDavid du Colombier }
147*af198995SDavid du Colombier docpu();
148*af198995SDavid du Colombier }
149*af198995SDavid du Colombier for(p = 0; p < nprocs; p++)
150*af198995SDavid du Colombier waitpid();
151*af198995SDavid du Colombier exits(nil);
152*af198995SDavid du Colombier }
153