|
|
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.