xref: /plan9-contrib/sys/src/cmd/ptrace/pm.c (revision af198995f3f1f1d87a386835b2bcd15ca90a6fed)
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