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