Commit | Line | Data |
---|---|---|
a3a97a46 TL |
1 | int bflg; |
2 | int dflg; | |
3 | int tflg; | |
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("/unix", nl); | |
54 | if(nl[0].type == -1) { | |
55 | printf("dk_busy not found in /unix 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++; | |
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(" RF RK RP PERCENT\n"); | |
87 | if(tflg) | |
88 | printf(" tin tout"); | |
89 | if (bflg==0) | |
90 | printf(" tpm msps mspt 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 | 16.0, /* RF */ | |
160 | 11.1, /* RK03/05 */ | |
161 | 2.48, /* RP06 */ | |
162 | }; | |
163 | ||
164 | stats(dn) | |
165 | { | |
166 | register i; | |
167 | double f1, f2, f3; | |
168 | double f4, f5, f6; | |
169 | long t; | |
170 | ||
171 | t = 0; | |
172 | for(i=0; i<32; i++) | |
173 | if(i & (1<<dn)) | |
174 | t += s.etime[i]; | |
175 | f1 = t; | |
176 | f1 = f1/60.; | |
177 | f2 = s.numb[dn]; | |
178 | if(f2 == 0.) { | |
179 | printf("%6.0f%6.1f%6.1f", 0.0, 0.0, 0.0); | |
180 | return; | |
181 | } | |
182 | f3 = s.wds[dn]; | |
183 | f3 = f3*32.; | |
184 | f4 = xf[2]; /* so far, only RP06's */ | |
185 | f4 = f4*1.0e-6; | |
186 | f5 = f1 - f4*f3; | |
187 | f6 = f1 - f5; | |
188 | printf("%6.0f", f2*60./etime); | |
189 | printf("%6.1f", f5*1000./f2); | |
190 | printf("%6.1f", f6*1000./f2); | |
191 | } | |
192 | ||
193 | stat1(o) | |
194 | { | |
195 | register i; | |
196 | long t; | |
197 | double f1, f2; | |
198 | ||
199 | t = 0; | |
200 | for(i=0; i<32; i++) | |
201 | t += s.etime[i]; | |
202 | f1 = t; | |
203 | if(f1 == 0.) | |
204 | f1 = 1.; | |
205 | t = 0; | |
206 | for(i=0; i<8; i++) | |
207 | t += s.etime[o+i]; | |
208 | f2 = t; | |
209 | printf("%6.2f", f2*100./f1); | |
210 | } | |
211 | ||
212 | stats2(t) | |
213 | double t; | |
214 | { | |
215 | register i, j; | |
216 | ||
217 | for (i=0; i<4; i++) { | |
218 | for (j=0; j<8; j++) | |
219 | printf("%6.2f\n", s.etime[8*i+j]/(t/100)); | |
220 | printf("\n"); | |
221 | } | |
222 | } | |
223 | ||
224 | stats3(t) | |
225 | double t; | |
226 | { | |
227 | register i; | |
228 | double sum; | |
229 | ||
230 | t /= 100; | |
231 | printf("%6.2f idle\n", s.etime[24]/t); | |
232 | sum = 0; | |
233 | for (i=0; i<8; i++) | |
234 | sum += s.etime[i]; | |
235 | printf("%6.2f user\n", sum/t); | |
236 | sum = 0; | |
237 | for (i=0; i<8; i++) | |
238 | sum += s.etime[8+i]; | |
239 | printf("%6.2f nice\n", sum/t); | |
240 | sum = 0; | |
241 | for (i=0; i<8; i++) | |
242 | sum += s.etime[16+i]; | |
243 | printf("%6.2f system\n", sum/t); | |
244 | sum = 0; | |
245 | for (i=1; i<8; i++) | |
246 | sum += s.etime[24+i]; | |
247 | printf("%6.2f IO wait\n", sum/t); | |
248 | sum = 0; | |
249 | for (i=1; i<8; i++) | |
250 | sum += s.etime[i]+s.etime[i+8]+s.etime[i+16]+s.etime[i+24]; | |
251 | printf("%6.2f IO active\n", sum/t); | |
252 | sum = 0; | |
253 | for (i=0; i<32; i++) | |
254 | if (i&01) | |
255 | sum += s.etime[i]; | |
256 | printf("%6.2f RF active\n", sum/t); | |
257 | sum = 0; | |
258 | for (i=0; i<32; i++) | |
259 | if (i&02) | |
260 | sum += s.etime[i]; | |
261 | printf("%6.2f RK active\n", sum/t); | |
262 | sum = 0; | |
263 | for (i=0; i<32; i++) | |
264 | if (i&04) | |
265 | sum += s.etime[i]; | |
266 | printf("%6.2f RP active\n", sum/t); | |
267 | } | |
268 | ||
269 | biostats() | |
270 | { | |
271 | register i; | |
272 | ||
273 | lseek(mf,(long)nl[6].value, 0); | |
274 | read(mf, (char *)&io_info, sizeof(io_info)); | |
275 | printf("%D\t%D\t%D\t%D\n", | |
276 | io_info.nread-io_delta.nread, io_info.nreada-io_delta.nreada, | |
277 | io_info.ncache-io_delta.ncache, io_info.nwrite-io_delta.nwrite); | |
278 | ||
279 | for(i=0; i<30; ) { | |
280 | printf("%D\t",(long)io_info.bufcount[i]-io_delta.bufcount[i]); | |
281 | i++; | |
282 | if (i % 10 == 0) | |
283 | printf("\n"); | |
284 | } | |
285 | io_delta = io_info; | |
286 | } |