|
|
1.1 root 1: /*
2: * iostat
3: */
4: #include <curses.h>
5: #include <signal.h>
6: #include <stdio.h>
7: #include <nlist.h>
8: #include <sys/types.h>
9: #include <sys/buf.h>
10: #include <sys/dk.h>
11: #include <vba/vbavar.h>
12: #include <vba/vddc.h>
13:
14: struct nlist nli[] = {
15: { "_dk_busy" },
16: #define X_DK_BUSY 0
17: { "_dk_time" },
18: #define X_DK_TIME 1
19: { "_dk_xfer" },
20: #define X_DK_XFER 2
21: { "_dk_wds" },
22: #define X_DK_WDS 3
23: { "_tk_nin" },
24: #define X_TK_NIN 4
25: { "_tk_nout" },
26: #define X_TK_NOUT 5
27: { "_dk_seek" },
28: #define X_DK_SEEK 6
29: { "_cp_time" },
30: #define X_CP_TIME 7
31: { "_dk_mspw" },
32: #define X_DK_MSPW 8
33: { "_hz" },
34: #define X_HZ 9
35: { "_vbdinit" },
36: #define X_VBDINIT 10
37: { "_vdst" },
38: #define X_VDST 11
39: { "_nvddrv" },
40: #define X_NVDDRV 12
41: { 0 },
42: };
43:
44: char dr_name[DK_NDRIVE][10];
45:
46: fs_tab *vdinfo,*vdinfo_save;
47: long name;
48:
49: struct
50: {
51: int dk_busy;
52: long cp_time[CPUSTATES];
53: long dk_time[DK_NDRIVE];
54: long dk_wds[DK_NDRIVE];
55: long dk_seek[DK_NDRIVE];
56: long dk_xfer[DK_NDRIVE];
57: float dk_mspw[DK_NDRIVE];
58: long tk_nin;
59: long tk_nout;
60: } s, s1;
61:
62: #define CPUSTE 4
63: #define NCOLS 80
64: #define NLINES 24
65: #define MAXRPT 4
66: #define UNIX "/vmunix"
67:
68: struct
69: {
70: float tin;
71: float tout;
72: float syste[CPUSTE];
73: float bps[DK_NDRIVE];
74: float tps[DK_NDRIVE];
75: float msps[DK_NDRIVE];
76: } rec[MAXRPT];
77:
78: int mf;
79: int hz;
80: int nodktyp;
81: int count,repcnt, iter;
82:
83: double etime;
84: extern char *malloc();
85:
86: main(argc, argv)
87: char *argv[];
88: {
89: extern char *ctime();
90: register i;
91: int iter;
92: int j, totrep;
93: double f1, f2;
94: long t;
95: int beg_i, end_i,head,hd;
96: int tohdr = 1;
97: int die();
98: int dietty();
99: int ptoutput();
100: int shiftarray();
101: int TERM;
102:
103: TERM = isatty(1);
104: nlist(UNIX, nli);
105: if(nli[X_DK_BUSY].n_value == 0) {
106: printf("dk_busy not found in %s namelist\n",UNIX);
107: exit(1);
108: }
109: mf = open("/dev/kmem", 0);
110: if(mf < 0) {
111: printf("cannot open /dev/kmem\n");
112: exit(1);
113: }
114: while (argc>1&&argv[1][0]=='-') {
115: argc--;
116: argv++;
117: }
118: lseek(mf, (long)nli[X_DK_MSPW].n_value, 0);
119: read(mf, s.dk_mspw, sizeof s.dk_mspw);
120: for (i = 0; i < DK_NDRIVE; i++)
121: sprintf (dr_name[i],"??%x",i);
122: lseek(mf, (long)nli[X_NVDDRV].n_value, 0);
123: read(mf, &nodktyp, sizeof nodktyp);
124: vdinfo = (fs_tab *)malloc(nodktyp*sizeof(fs_tab));
125: lseek(mf, (long)nli[X_VDST].n_value, 0);
126: read(mf, (char *)vdinfo, nodktyp*sizeof(fs_tab));
127: vdinfo_save = vdinfo;
128: for (i = 0; i < nodktyp; vdinfo++, i++) {
129: name = (long)vdinfo->type_name;
130: vdinfo->type_name = malloc(3);
131: lseek(mf, (long)name, 0);
132: read(mf, vdinfo->type_name, 3);
133: }
134: vdinfo = vdinfo_save;
135: read_names();
136:
137: totrep = 1;
138: if(argc > 2)
139: totrep = atoi(argv[2]);
140: if (argc ==2)
141: totrep = -1;
142: iter = 0;
143: if ((totrep < 0) || (totrep > MAXRPT))
144: repcnt = MAXRPT;
145: else
146: repcnt = totrep;
147: if (TERM){
148: initscr();
149: signal(SIGINT,dietty);
150: nonl();
151: crmode();
152: noecho();
153: leaveok(stdscr, TRUE);
154: scrollok(stdscr,FALSE);
155: }
156: else
157: signal(SIGINT,die);
158: loop:
159: head = 4;
160: end_i = 0;
161: hd=0;
162: lseek(mf, (long)nli[X_DK_BUSY].n_value, 0);
163: read(mf, &s.dk_busy, sizeof s.dk_busy);
164: lseek(mf, (long)nli[X_DK_TIME].n_value, 0);
165: read(mf, s.dk_time, sizeof s.dk_time);
166: lseek(mf, (long)nli[X_DK_XFER].n_value, 0);
167: read(mf, s.dk_xfer, sizeof s.dk_xfer);
168: lseek(mf, (long)nli[X_DK_WDS].n_value, 0);
169: read(mf, s.dk_wds, sizeof s.dk_wds);
170: lseek(mf, (long)nli[X_TK_NIN].n_value, 0);
171: read(mf, &s.tk_nin, sizeof s.tk_nin);
172: lseek(mf, (long)nli[X_TK_NOUT].n_value, 0);
173: read(mf, &s.tk_nout, sizeof s.tk_nout);
174: lseek(mf, (long)nli[X_DK_SEEK].n_value, 0);
175: read(mf, s.dk_seek, sizeof s.dk_seek);
176: lseek(mf, (long)nli[X_CP_TIME].n_value, 0);
177: read(mf, s.cp_time, sizeof s.cp_time);
178: lseek(mf, (long)nli[X_DK_MSPW].n_value, 0);
179: read(mf, s.dk_mspw, sizeof s.dk_mspw);
180: lseek(mf, (long)nli[X_HZ].n_value, 0);
181: read(mf, &hz, sizeof hz);
182: for (i = 0; i < DK_NDRIVE; i++) {
183: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
184: X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
185: }
186: t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
187: t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
188: etime = 0;
189: for(i=0; i<CPUSTATES; i++) {
190: X(cp_time);
191: etime += s.cp_time[i];
192: }
193: if (etime == 0.0)
194: etime = 1.0;
195: etime /= (float) hz;
196: rec[iter].tin = s.tk_nin/etime;
197: rec[iter].tout = s.tk_nout/etime;
198: for (i=0; i<DK_NDRIVE; i++){
199: if(dr_name[i][0] != '?'){
200: stats(i,iter);
201: }
202: }
203: for (i=0; i<CPUSTATES; i++)
204: stat1(i,iter);
205: count++;
206: prt_loop:
207: beg_i = hd;
208: if (TERM) {
209: if (head == 4)
210: printw(" tty tin tout cpu us ni sy id ");
211: for (i = hd; i < DK_NDRIVE; i++){
212: if (dr_name[i][0] != '?'){
213: printw(" %3.3s ",dr_name[i]);
214: head++;
215: if ((head % 5 )== 0)
216: break;
217: }
218: }
219: if (head !=5 )
220: printw ("\n");
221: if (i == DK_NDRIVE)
222: i--;
223: end_i = i;
224: for (i = beg_i; i <= end_i; i++)
225: if(dr_name[i][0] != '?')
226: printw(" bps tps msps");
227: printw ("\n");
228: for(i = 0; i < (iter+1); i++){
229: if (head == 5){
230: printw(" %4.0f%5.0f ",rec[i].tin,rec[i].tout);
231: for (j = 0; j < CPUSTE; j++)
232: printw("%3.0f",rec[i].syste[j]);
233: printw(" ");
234: }
235: for (j = beg_i; j <= end_i; j++)
236: if (dr_name[j][0] != '?')
237: printw("%4.0f%4.0f %5.1f",
238: rec[i].bps[j], rec[i].tps[j],
239: rec[i].msps[j]);
240: printw ("\n");
241: }
242: for(i=(iter+1); i<repcnt; i++)
243: printw("\n");
244: if (end_i < (DK_NDRIVE-1) ){
245: hd = end_i+1;
246: goto prt_loop;
247: }
248: refresh();
249: move(0,0);
250: }
251: else
252: if ((count >= MAXRPT) &&( (count % MAXRPT ) == 0))
253: ptoutput(iter+1);
254:
255: if (totrep > 0 )
256: totrep--;
257: iter++;
258:
259: if (count >= MAXRPT ){
260: for(i=0; i < (MAXRPT -1); i++){
261: shiftarray(i,1);
262: }
263: iter = MAXRPT-1;
264: }
265: /*
266:
267: if (count >= MAXRPT) {
268: for(i = 0; i < (MAXRPT-1); i ++){
269: rec[i].tin = rec[i+1].tin;
270: rec[i].tout = rec[i+1].tout;
271: for(j=0; j < CPUSTATES; j++)
272: rec[i].syste[j] = rec[i+1].syste[j];
273: for(j=0; j< DK_NDRIVE; j++){
274: rec[i].bps[j] =rec[i+1].bps[j];
275: rec[i].tps[j] =rec[i+1].tps[j];
276: rec[i].msps[j] =rec[i+1].msps[j];
277: }
278: }
279: iter = MAXRPT -1;
280: }
281: */
282:
283: if (totrep != 0 ){
284: if(argc > 1) {
285: sleep(atoi(argv[1]));
286: goto loop;
287: }
288: }
289: if(TERM)
290: dietty();
291: else
292: die();
293: }
294:
295: stats(dn,cnt)
296: {
297: register i;
298: double atime, words, xtime, itime;
299: /*
300: if (s.dk_mspw[dn] == 0.0) {
301: rec[cnt].bps[dn] = 0.0;
302: rec[cnt].tps[dn] = 0.0;
303: rec[cnt].msps[dn] = 0.0;
304: return;
305: }
306: */
307: atime = s.dk_time[dn];
308: atime /= (float) hz;
309: words = s.dk_wds[dn]*32.0; /* number of words transferred */
310: xtime = s.dk_mspw[dn]*words; /* transfer time */
311: itime = atime - xtime; /* time not transferring */
312: if (xtime < 0)
313: itime += xtime, xtime = 0;
314: if (itime < 0)
315: xtime += itime, itime = 0;
316: rec[cnt].bps[dn] = words/512/etime;
317: rec[cnt].tps[dn] = s.dk_xfer[dn]/etime;
318: rec[cnt].msps[dn] = s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0;
319: }
320:
321: stat1(o,ict)
322: {
323: register i;
324: double time;
325:
326: time = 0;
327: for(i=0; i<CPUSTATES; i++)
328: time += s.cp_time[i];
329: if (time == 0.0)
330: time = 1.0;
331: rec[ict].syste[o] = 100*s.cp_time[o]/time;
332: }
333:
334: #define steal(where, var) lseek(mf, where, 0); read(mf, &var, sizeof var);
335:
336: read_names()
337: {
338: struct vba_device udev, *up;
339: struct vba_driver udrv;
340: int unit, i;
341:
342: up = (struct vba_device *) nli[X_VBDINIT].n_value;
343: if (up == 0)
344: {
345: fprintf(stderr, "iostat: Disk init info not in namelist\n");
346: exit(1);
347: }
348: vdinfo_save = vdinfo;
349: for (;;) {
350: steal(up++, udev);
351: if (udev.ui_driver == 0)
352: break;
353: if (udev.ui_dk <= 0 || udev.ui_alive == 0)
354: continue;
355: unit = (udev.ui_ctlr * 4) + udev.ui_slave;
356: if(udev.ui_type >= nodktyp){
357: fprintf(stderr,"iostat : disk type in unit %d not supported \n",unit);
358: exit(1);
359: }
360: vdinfo = vdinfo_save;
361: for(i=0; i < udev.ui_type; i++)
362: vdinfo++;
363: dr_name[unit][0] = vdinfo->type_name[0];
364: dr_name[unit][1] = vdinfo->type_name[1];
365: }
366: }
367: die()
368: {
369: int i,j,k;
370: iter--;
371: signal(SIGINT,SIG_IGN);
372: i = count % MAXRPT;
373: if (count >= MAXRPT){
374: k = MAXRPT - i;
375: for (j=0; j <i; j++)
376: shiftarray(0,k);
377: }
378: ptoutput(i);
379: exit(0);
380: }
381: dietty()
382: {
383: signal(SIGINT, SIG_IGN);
384: mvcur(0,COLS-1, LINES-1,0);
385: endwin();
386: exit(0);
387: }
388: ptoutput(reptot)
389: int reptot;
390: {
391: register i,j;
392: int doneflg,head,end_i,beg_i;
393: head = 4;
394: beg_i = 0;
395: doneflg=0;
396: printf(" tty tin tout cpu us ni sy id ");
397: while (!doneflg){
398: for (i = beg_i; i < DK_NDRIVE; i++){
399: if (dr_name[i][0] != '?'){
400: printf(" %3.3s ",dr_name[i]);
401: head++;
402: if ((head % 5 )== 0)
403: break;
404: }
405: }
406: if (head !=5 )
407: printf ("\n");
408: if (i == DK_NDRIVE){
409: i--;
410: doneflg++;
411: }
412: end_i = i;
413: for (i = beg_i; i <= end_i; i++)
414: if(dr_name[i][0] != '?')
415: printf(" bps tps msps");
416: printf ("\n");
417: for(i = 0; i < reptot; i++){
418: if (head == 5){
419: printf(" %4.0f%5.0f ",
420: rec[i].tin,rec[i].tout);
421: for (j = 0; j < CPUSTE; j++)
422: printf("%3.0f",rec[i].syste[j]);
423: printf(" ");
424: }
425: for (j = beg_i; j <= end_i; j++)
426: if (dr_name[j][0] != '?'){
427: printf("%4.0f%4.0f %5.1f", rec[i].bps[j],
428: rec[i].tps[j],rec[i].msps[j]);
429: }
430: printf ("\n");
431: }
432: for(i=reptot; i<repcnt; i++)
433: printf("\n");
434: beg_i = end_i;
435: }
436: }
437: shiftarray(srtary,offset)
438: int srtary; /* starting array to be shifted */
439: int offset; /* offset to be skip in shifting array */
440: {
441: register j;
442: rec[srtary].tin = rec[srtary+offset].tin;
443: rec[srtary].tout = rec[srtary+offset].tout;
444: for(j=0; j < CPUSTATES; j++)
445: rec[srtary].syste[j] = rec[srtary+offset].syste[j];
446: for(j=0; j< DK_NDRIVE; j++){
447: rec[srtary].bps[j] =rec[srtary+offset].bps[j];
448: rec[srtary].tps[j] =rec[srtary+offset].tps[j];
449: rec[srtary].msps[j] =rec[srtary+offset].msps[j];
450: }
451: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.