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