BSD 3 development
[unix-history] / usr / src / cmd / iostat.c
CommitLineData
c4d39227
BJ
1int bflg;
2int dflg;
3int tflg = 1;
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("/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
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 2.48, /* RP06 */
160 2.48, /* RP06 */
161 1.66, /* RM03 */
162 16.0, /* RF */
163 11.1, /* RK03/05 */
164};
165
166stats(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
208stat1(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
227stats2(t)
228double 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
239stats3(t)
240double 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
286biostats()
287{
288register 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}