Bell 32V development
[unix-history] / usr / src / cmd / iostat.c
CommitLineData
a3a97a46
TL
1int bflg;
2int dflg;
3int tflg;
4int iflg;
5int aflg;
6int sflg;
7struct
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};
22struct
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
32struct 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;
40double etime;
41
42int mf;
43
44main(argc, argv)
45char *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
93loop:
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");
148contin:
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 */
158double xf[] = {
159 16.0, /* RF */
160 11.1, /* RK03/05 */
161 2.48, /* RP06 */
162};
163
164stats(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
193stat1(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
212stats2(t)
213double 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
224stats3(t)
225double 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
269biostats()
270{
271register 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}