Commit | Line | Data |
---|---|---|
c4d39227 BJ |
1 | int bflg; |
2 | int dflg; | |
3 | int tflg = 1; | |
4 | int iflg; | |
5 | int aflg; | |
6 | int sflg; | |
7 | struct | |
8 | { | |
9 | char name[8]; | |
10 | int type; | |
11 | unsigned value; | |
12 | } nl[] = { | |
13 | "_dk_busy", 0, 0, | |
14 | "_dk_time", 0, 0, | |
15 | "_dk_numb", 0, 0, | |
16 | "_dk_wds", 0, 0, | |
17 | "_tk_nin", 0, 0, | |
18 | "_tk_nout", 0, 0, | |
19 | "_io_info", 0, 0, | |
20 | "\0\0\0\0\0\0\0\0", 0, 0 | |
21 | }; | |
22 | struct | |
23 | { | |
24 | int busy; | |
25 | long etime[32]; | |
26 | long numb[3]; | |
27 | long wds[3]; | |
28 | long tin; | |
29 | long tout; | |
30 | } s, s1; | |
31 | ||
32 | struct iostat { | |
33 | int nbuf; | |
34 | long nread; | |
35 | long nreada; | |
36 | long ncache; | |
37 | long nwrite; | |
38 | long bufcount[50]; | |
39 | } io_info, io_delta; | |
40 | double etime; | |
41 | ||
42 | int mf; | |
43 | ||
44 | main(argc, argv) | |
45 | char *argv[]; | |
46 | { | |
47 | extern char *ctime(); | |
48 | register i; | |
49 | int iter; | |
50 | double f1, f2; | |
51 | long t; | |
52 | ||
53 | nlist("/vmunix", nl); | |
54 | if(nl[0].type == -1) { | |
55 | printf("dk_busy not found in /vmunix namelist\n"); | |
56 | exit(1); | |
57 | } | |
58 | mf = open("/dev/kmem", 0); | |
59 | if(mf < 0) { | |
60 | printf("cannot open /dev/kmem\n"); | |
61 | exit(1); | |
62 | } | |
63 | iter = 0; | |
64 | while (argc>1&&argv[1][0]=='-') { | |
65 | if (argv[1][1]=='d') | |
66 | dflg++; | |
67 | else if (argv[1][1]=='s') | |
68 | sflg++; | |
69 | else if (argv[1][1]=='a') | |
70 | aflg++; | |
71 | else if (argv[1][1]=='t') | |
72 | tflg++; | |
73 | else if (argv[1][1]=='i') | |
74 | iflg++; | |
75 | else if (argv[1][1]=='b') | |
76 | bflg++, tflg = 0; | |
77 | argc--; | |
78 | argv++; | |
79 | } | |
80 | if(argc > 2) | |
81 | iter = atoi(argv[2]); | |
82 | if (!(sflg|iflg)) { | |
83 | if(tflg) | |
84 | printf(" TTY"); | |
85 | if (bflg==0) | |
86 | printf(" RP RM PERCENT\n"); | |
87 | if(tflg) | |
88 | printf(" tin tout"); | |
89 | if (bflg==0) | |
90 | printf(" spm tpm msps mspt tpm msps mspt user nice systm idle\n"); | |
91 | } | |
92 | ||
93 | loop: | |
94 | lseek(mf, (long)nl[0].value, 0); | |
95 | read(mf, &s.busy, sizeof s.busy); | |
96 | lseek(mf, (long)nl[1].value, 0); | |
97 | read(mf, s.etime, sizeof s.etime); | |
98 | lseek(mf, (long)nl[2].value, 0); | |
99 | read(mf, s.numb, sizeof s.numb); | |
100 | lseek(mf, (long)nl[3].value, 0); | |
101 | read(mf, s.wds, sizeof s.wds); | |
102 | lseek(mf, (long)nl[4].value, 0); | |
103 | read(mf, &s.tin, sizeof s.tin); | |
104 | lseek(mf, (long)nl[5].value, 0); | |
105 | read(mf, &s.tout, sizeof s.tout); | |
106 | for(i=0; i<40; i++) { | |
107 | t = s.etime[i]; | |
108 | s.etime[i] -= s1.etime[i]; | |
109 | s1.etime[i] = t; | |
110 | } | |
111 | t = 0; | |
112 | for(i=0; i<32; i++) | |
113 | t += s.etime[i]; | |
114 | etime = t; | |
115 | if(etime == 0.) | |
116 | etime = 1.; | |
117 | if (bflg) { | |
118 | biostats(); | |
119 | goto contin; | |
120 | } | |
121 | if (dflg) { | |
122 | long tm; | |
123 | time(&tm); | |
124 | printf("%s", ctime(&tm)); | |
125 | } | |
126 | if (aflg) | |
127 | printf("%.2f minutes total\n", etime/3600); | |
128 | if (sflg) { | |
129 | stats2(etime); | |
130 | goto contin; | |
131 | } | |
132 | if (iflg) { | |
133 | stats3(etime); | |
134 | goto contin; | |
135 | } | |
136 | etime /= 60.; | |
137 | if(tflg) { | |
138 | f1 = s.tin; | |
139 | f2 = s.tout; | |
140 | printf("%6.1f", f1/etime); | |
141 | printf("%6.1f", f2/etime); | |
142 | } | |
143 | for(i=0; i<3; i++) | |
144 | stats(i); | |
145 | for(i=0; i<4; i++) | |
146 | stat1(i*8); | |
147 | printf("\n"); | |
148 | contin: | |
149 | --iter; | |
150 | if(iter) | |
151 | if(argc > 1) { | |
152 | sleep(atoi(argv[1])); | |
153 | goto loop; | |
154 | } | |
155 | } | |
156 | ||
157 | /* usec per word for the various disks */ | |
158 | double xf[] = { | |
159 | 2.48, /* RP06 */ | |
160 | 2.48, /* RP06 */ | |
161 | 1.66, /* RM03 */ | |
162 | 16.0, /* RF */ | |
163 | 11.1, /* RK03/05 */ | |
164 | }; | |
165 | ||
166 | stats(dn) | |
167 | { | |
168 | register i; | |
169 | double f1, f2, f3; | |
170 | double f4, f5, f6; | |
171 | long t; | |
172 | static float zerof5; | |
173 | ||
174 | t = 0; | |
175 | for(i=0; i<32; i++) | |
176 | if(i & (1<<dn)) | |
177 | t += s.etime[i]; | |
178 | f1 = t; | |
179 | f1 = f1/60.; | |
180 | f2 = s.numb[dn]; | |
181 | if(f2 == 0. && dn) { | |
182 | printf("%6.0f%6.1f%6.1f", 0.0, 0.0, 0.0); | |
183 | return; | |
184 | } | |
185 | f3 = s.wds[dn]; | |
186 | f3 = f3*32.; | |
187 | f4 = xf[dn]; | |
188 | f4 = f4*1.0e-6; | |
189 | f5 = f1 - f4*f3; | |
190 | f6 = f1 - f5; | |
191 | if (dn == 0) { | |
192 | if (s.numb[0] == 0) { | |
193 | f2 = s.numb[0] = 1; | |
194 | s.wds[0] = 0; | |
195 | } | |
196 | printf("%6.0f", s.numb[0]*60./etime); | |
197 | zerof5 = f5*1000./f2; | |
198 | return; | |
199 | } | |
200 | printf("%6.0f", f2*60./etime); | |
201 | if (dn == 1) /* hack together seek time for rp */ | |
202 | printf("%6.1f", f5*1000./f2 + zerof5); | |
203 | else | |
204 | printf("%6.1f", f5*1000./f2); | |
205 | printf("%6.1f", f6*1000./f2); | |
206 | } | |
207 | ||
208 | stat1(o) | |
209 | { | |
210 | register i; | |
211 | long t; | |
212 | double f1, f2; | |
213 | ||
214 | t = 0; | |
215 | for(i=0; i<32; i++) | |
216 | t += s.etime[i]; | |
217 | f1 = t; | |
218 | if(f1 == 0.) | |
219 | f1 = 1.; | |
220 | t = 0; | |
221 | for(i=0; i<8; i++) | |
222 | t += s.etime[o+i]; | |
223 | f2 = t; | |
224 | printf("%6.2f", f2*100./f1); | |
225 | } | |
226 | ||
227 | stats2(t) | |
228 | double t; | |
229 | { | |
230 | register i, j; | |
231 | ||
232 | for (i=0; i<4; i++) { | |
233 | for (j=0; j<8; j++) | |
234 | printf("%6.2f\n", s.etime[8*i+j]/(t/100)); | |
235 | printf("\n"); | |
236 | } | |
237 | } | |
238 | ||
239 | stats3(t) | |
240 | double t; | |
241 | { | |
242 | register i; | |
243 | double sum; | |
244 | ||
245 | t /= 100; | |
246 | printf("%6.2f idle\n", s.etime[24]/t); | |
247 | sum = 0; | |
248 | for (i=0; i<8; i++) | |
249 | sum += s.etime[i]; | |
250 | printf("%6.2f user\n", sum/t); | |
251 | sum = 0; | |
252 | for (i=0; i<8; i++) | |
253 | sum += s.etime[8+i]; | |
254 | printf("%6.2f nice\n", sum/t); | |
255 | sum = 0; | |
256 | for (i=0; i<8; i++) | |
257 | sum += s.etime[16+i]; | |
258 | printf("%6.2f system\n", sum/t); | |
259 | sum = 0; | |
260 | for (i=1; i<8; i++) | |
261 | sum += s.etime[24+i]; | |
262 | printf("%6.2f IO wait\n", sum/t); | |
263 | sum = 0; | |
264 | for (i=1; i<8; i++) | |
265 | sum += s.etime[i]+s.etime[i+8]+s.etime[i+16]+s.etime[i+24]; | |
266 | printf("%6.2f IO active\n", sum/t); | |
267 | sum = 0; | |
268 | for (i=0; i<32; i++) | |
269 | if (i&01) | |
270 | sum += s.etime[i]; | |
271 | printf("%6.2f RP seek\n", sum/t); | |
272 | sum = 0; | |
273 | for (i=0; i<32; i++) | |
274 | if (i&02) | |
275 | sum += s.etime[i]; | |
276 | printf("%6.2f RP transfer\n", sum/t); | |
277 | /* | |
278 | sum = 0; | |
279 | for (i=0; i<32; i++) | |
280 | if (i&04) | |
281 | sum += s.etime[i]; | |
282 | printf("%6.2f RP active\n", sum/t); | |
283 | */ | |
284 | } | |
285 | ||
286 | biostats() | |
287 | { | |
288 | register i; | |
289 | ||
290 | lseek(mf,(long)nl[6].value, 0); | |
291 | read(mf, (char *)&io_info, sizeof(io_info)); | |
292 | printf("%D\t%D\t%D\t%D\n", | |
293 | io_info.nread-io_delta.nread, io_info.nreada-io_delta.nreada, | |
294 | io_info.ncache-io_delta.ncache, io_info.nwrite-io_delta.nwrite); | |
295 | ||
296 | for(i=0; i<30; ) { | |
297 | printf("%D\t",(long)io_info.bufcount[i]-io_delta.bufcount[i]); | |
298 | i++; | |
299 | if (i % 10 == 0) | |
300 | printf("\n"); | |
301 | } | |
302 | io_delta = io_info; | |
303 | } |