Research V7 development
[unix-history] / usr / src / cmd / iostat.c
CommitLineData
80a00278
KT
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 "_io_info", 0, 0,
15 "\0\0\0\0\0\0\0\0", 0, 0
16};
17struct
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
27struct 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;
35double etime;
36
37int mf;
38
39main(argc, argv)
40char *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
88loop:
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");
133contin:
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 */
143double xf[] = {
144 16.0, /* RF */
145 11.1, /* RK03/05 */
146 2.48, /* RP06 */
147};
148
149stats(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
178stat1(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
197stats2(t)
198double 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
209stats3(t)
210double 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
254biostats()
255{
256register 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}