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