routing statistics
[unix-history] / usr / src / usr.sbin / iostat / iostat.c
CommitLineData
41b4a915 1static char *sccsid = "@(#)iostat.c 4.7 (Berkeley) 83/02/23";
be974f30
BJ
2/*
3 * iostat
4 */
700789be 5#include <stdio.h>
be974f30 6#include <nlist.h>
700789be
MT
7#include <sys/types.h>
8#include <sys/buf.h>
41b4a915
BS
9#include <sys/dk.h>
10#ifdef vax
700789be
MT
11#include <sys/ubavar.h>
12#include <sys/mbavar.h>
41b4a915
BS
13#endif
14#ifdef sun
15#include <sundev/mbvar.h>
16#endif
be974f30
BJ
17
18struct nlist nl[] = {
19 { "_dk_busy" },
20#define X_DK_BUSY 0
21 { "_dk_time" },
22#define X_DK_TIME 1
23 { "_dk_xfer" },
24#define X_DK_XFER 2
25 { "_dk_wds" },
26#define X_DK_WDS 3
27 { "_tk_nin" },
28#define X_TK_NIN 4
29 { "_tk_nout" },
30#define X_TK_NOUT 5
31 { "_dk_seek" },
32#define X_DK_SEEK 6
33 { "_cp_time" },
34#define X_CP_TIME 7
35 { "_dk_mspw" },
36#define X_DK_MSPW 8
41b4a915
BS
37
38#ifdef vax
700789be
MT
39 { "_mbdinit" },
40#define X_MBDINIT 9
41 { "_ubdinit" },
42#define X_UBDINIT 10
41b4a915
BS
43#endif
44
45#ifdef sun
46 { "_mbdinit" },
47#define X_MBDINIT 9
48#endif
49
be974f30
BJ
50 { 0 },
51};
700789be
MT
52
53char dr_name[DK_NDRIVE][10];
54
be974f30
BJ
55struct
56{
57 int dk_busy;
58 long cp_time[CPUSTATES];
59 long dk_time[DK_NDRIVE];
60 long dk_wds[DK_NDRIVE];
61 long dk_seek[DK_NDRIVE];
62 long dk_xfer[DK_NDRIVE];
63 float dk_mspw[DK_NDRIVE];
64 long tk_nin;
65 long tk_nout;
66} s, s1;
67
68int mf;
69double etime;
70
71main(argc, argv)
72char *argv[];
73{
74 extern char *ctime();
75 register i;
76 int iter;
77 double f1, f2;
78 long t;
8b6704d4 79 int tohdr = 1;
be974f30
BJ
80
81 nlist("/vmunix", nl);
82 if(nl[X_DK_BUSY].n_type == 0) {
83 printf("dk_busy not found in /vmunix namelist\n");
84 exit(1);
85 }
86 mf = open("/dev/kmem", 0);
87 if(mf < 0) {
88 printf("cannot open /dev/kmem\n");
89 exit(1);
90 }
91 iter = 0;
92 while (argc>1&&argv[1][0]=='-') {
93 argc--;
94 argv++;
95 }
96 lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
97 read(mf, s.dk_mspw, sizeof s.dk_mspw);
700789be
MT
98 for (i = 0; i < DK_NDRIVE; i++)
99 sprintf(dr_name[i], "dk%d", i);
100 read_names();
be974f30
BJ
101 if(argc > 2)
102 iter = atoi(argv[2]);
be974f30 103loop:
8b6704d4 104 if (--tohdr == 0) {
700789be 105 printf(" tty");
8b6704d4
BJ
106 for (i = 0; i < DK_NDRIVE; i++)
107 if (s.dk_mspw[i] != 0.0)
700789be
MT
108 printf(" %3.3s ", dr_name[i]);
109 printf(" cpu\n");
8b6704d4
BJ
110 printf(" tin tout");
111 for (i = 0; i < DK_NDRIVE; i++)
112 if (s.dk_mspw[i] != 0.0)
113 printf(" sps tps msps ");
114 printf(" us ni sy id\n");
115 tohdr = 19;
116 }
be974f30
BJ
117 lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
118 read(mf, &s.dk_busy, sizeof s.dk_busy);
119 lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
120 read(mf, s.dk_time, sizeof s.dk_time);
121 lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
122 read(mf, s.dk_xfer, sizeof s.dk_xfer);
123 lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
124 read(mf, s.dk_wds, sizeof s.dk_wds);
125 lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
126 read(mf, &s.tk_nin, sizeof s.tk_nin);
127 lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
128 read(mf, &s.tk_nout, sizeof s.tk_nout);
129 lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
130 read(mf, s.dk_seek, sizeof s.dk_seek);
131 lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
132 read(mf, s.cp_time, sizeof s.cp_time);
133 lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
134 read(mf, s.dk_mspw, sizeof s.dk_mspw);
135 for (i = 0; i < DK_NDRIVE; i++) {
136#define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
137 X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
138 }
139 t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
140 t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
141 etime = 0;
142 for(i=0; i<CPUSTATES; i++) {
143 X(cp_time);
144 etime += s.cp_time[i];
145 }
146 if (etime == 0.0)
147 etime = 1.0;
148 etime /= 60.0;
149 printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
150 for (i=0; i<DK_NDRIVE; i++)
151 if (s.dk_mspw[i] != 0.0)
152 stats(i);
153 for (i=0; i<CPUSTATES; i++)
154 stat1(i);
155 printf("\n");
156contin:
157 --iter;
158 if(iter)
159 if(argc > 1) {
160 sleep(atoi(argv[1]));
161 goto loop;
162 }
163}
164
165stats(dn)
166{
167 register i;
168 double atime, words, xtime, itime;
169
170 if (s.dk_mspw[dn] == 0.0) {
171 printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
172 return;
173 }
174 atime = s.dk_time[dn];
175 atime /= 60.0;
176 words = s.dk_wds[dn]*32.0; /* number of words transferred */
177 xtime = s.dk_mspw[dn]*words; /* transfer time */
178 itime = atime - xtime; /* time not transferring */
179/*
180 printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
181 dn, words, atime, xtime, itime);
182*/
183 if (xtime < 0)
184 itime += xtime, xtime = 0;
185 if (itime < 0)
186 xtime += itime, itime = 0;
187 printf("%4.0f", s.dk_seek[dn]/etime);
188 printf("%4.0f", s.dk_xfer[dn]/etime);
189 printf("%5.1f ",
190 s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
191/*
192 printf("%4.1f",
193 s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
194*/
195}
196
197stat1(o)
198{
199 register i;
200 double time;
201
202 time = 0;
203 for(i=0; i<CPUSTATES; i++)
204 time += s.cp_time[i];
205 if (time == 0.0)
206 time = 1.0;
207 printf("%3.0f", 100*s.cp_time[o]/time);
208}
700789be 209
700789be 210#define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
41b4a915
BS
211
212#ifdef vax
700789be
MT
213read_names()
214{
215 struct mba_device mdev;
216 register struct mba_device *mp;
217 struct mba_driver mdrv;
218 short two_char;
219 char *cp = (char *) &two_char;
220 struct uba_device udev, *up;
221 struct uba_driver udrv;
222
223 mp = (struct mba_device *) nl[X_MBDINIT].n_value;
224 up = (struct uba_device *) nl[X_UBDINIT].n_value;
0e22e6c5 225 if (up == 0)
700789be
MT
226 {
227 fprintf(stderr, "iostat: Disk init info not in namelist\n");
228 exit(1);
229 }
41b4a915 230 if (mp) for (;;) {
700789be
MT
231 steal(mp++, mdev);
232 if (mdev.mi_driver == 0)
233 break;
234 if (mdev.mi_dk < 0 || mdev.mi_alive == 0)
235 continue;
236 steal(mdev.mi_driver, mdrv);
237 steal(mdrv.md_dname, two_char);
238 sprintf(dr_name[mdev.mi_dk], "%c%c%d", cp[0], cp[1], mdev.mi_unit);
239 }
41b4a915 240 if (up) for (;;) {
700789be
MT
241 steal(up++, udev);
242 if (udev.ui_driver == 0)
243 break;
244 if (udev.ui_dk < 0 || udev.ui_alive == 0)
245 continue;
246 steal(udev.ui_driver, udrv);
247 steal(udrv.ud_dname, two_char);
248 sprintf(dr_name[udev.ui_dk], "%c%c%d", cp[0], cp[1], udev.ui_unit);
249 }
250}
41b4a915
BS
251#endif
252
253#ifdef sun
254read_names()
255{
256 struct mb_device mdev;
257 register struct mb_device *mp;
258 struct mb_driver mdrv;
259 short two_char;
260 char *cp = (char *) &two_char;
261
262 mp = (struct mb_device *) nl[X_MBDINIT].n_value;
263 if (mp == 0) {
264 fprintf(stderr, "iostat: Disk init info not in namelist\n");
265 exit(1);
266 }
267 for (;;) {
268 steal(mp++, mdev);
269 if (mdev.md_driver == 0)
270 break;
271 if (mdev.md_dk < 0 || mdev.md_alive == 0)
272 continue;
273 steal(mdev.md_driver, mdrv);
274 steal(mdrv.mdr_dname, two_char);
275 sprintf(dr_name[mdev.md_dk], "%c%c%d", cp[0], cp[1], mdev.md_unit);
276 }
277}
278#endif