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