|
|
1.1 ! root 1: static char *sccsid = "@(#)iostat.c 4.2 (Berkeley) 10/19/80"; ! 2: /* ! 3: * iostat ! 4: */ ! 5: #include <nlist.h> ! 6: #include <sys/dk.h> ! 7: ! 8: struct nlist nl[] = { ! 9: { "_dk_busy" }, ! 10: #define X_DK_BUSY 0 ! 11: { "_dk_time" }, ! 12: #define X_DK_TIME 1 ! 13: { "_dk_xfer" }, ! 14: #define X_DK_XFER 2 ! 15: { "_dk_wds" }, ! 16: #define X_DK_WDS 3 ! 17: { "_tk_nin" }, ! 18: #define X_TK_NIN 4 ! 19: { "_tk_nout" }, ! 20: #define X_TK_NOUT 5 ! 21: { "_dk_seek" }, ! 22: #define X_DK_SEEK 6 ! 23: { "_cp_time" }, ! 24: #define X_CP_TIME 7 ! 25: { "_dk_mspw" }, ! 26: #define X_DK_MSPW 8 ! 27: { 0 }, ! 28: }; ! 29: struct ! 30: { ! 31: int dk_busy; ! 32: long cp_time[CPUSTATES]; ! 33: long dk_time[DK_NDRIVE]; ! 34: long dk_wds[DK_NDRIVE]; ! 35: long dk_seek[DK_NDRIVE]; ! 36: long dk_xfer[DK_NDRIVE]; ! 37: float dk_mspw[DK_NDRIVE]; ! 38: long tk_nin; ! 39: long tk_nout; ! 40: } s, s1; ! 41: ! 42: int mf; ! 43: double etime; ! 44: ! 45: main(argc, argv) ! 46: char *argv[]; ! 47: { ! 48: extern char *ctime(); ! 49: register i; ! 50: int iter; ! 51: double f1, f2; ! 52: long t; ! 53: int tohdr = 1; ! 54: ! 55: nlist("/vmunix", nl); ! 56: if(nl[X_DK_BUSY].n_type == 0) { ! 57: printf("dk_busy not found in /vmunix namelist\n"); ! 58: exit(1); ! 59: } ! 60: mf = open("/dev/kmem", 0); ! 61: if(mf < 0) { ! 62: printf("cannot open /dev/kmem\n"); ! 63: exit(1); ! 64: } ! 65: iter = 0; ! 66: while (argc>1&&argv[1][0]=='-') { ! 67: argc--; ! 68: argv++; ! 69: } ! 70: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); ! 71: read(mf, s.dk_mspw, sizeof s.dk_mspw); ! 72: if(argc > 2) ! 73: iter = atoi(argv[2]); ! 74: loop: ! 75: if (--tohdr == 0) { ! 76: printf(" TTY"); ! 77: for (i = 0; i < DK_NDRIVE; i++) ! 78: if (s.dk_mspw[i] != 0.0) ! 79: printf(" D%d ", i); ! 80: printf(" CPU\n"); ! 81: printf(" tin tout"); ! 82: for (i = 0; i < DK_NDRIVE; i++) ! 83: if (s.dk_mspw[i] != 0.0) ! 84: printf(" sps tps msps "); ! 85: printf(" us ni sy id\n"); ! 86: tohdr = 19; ! 87: } ! 88: lseek(mf, (long)nl[X_DK_BUSY].n_value, 0); ! 89: read(mf, &s.dk_busy, sizeof s.dk_busy); ! 90: lseek(mf, (long)nl[X_DK_TIME].n_value, 0); ! 91: read(mf, s.dk_time, sizeof s.dk_time); ! 92: lseek(mf, (long)nl[X_DK_XFER].n_value, 0); ! 93: read(mf, s.dk_xfer, sizeof s.dk_xfer); ! 94: lseek(mf, (long)nl[X_DK_WDS].n_value, 0); ! 95: read(mf, s.dk_wds, sizeof s.dk_wds); ! 96: lseek(mf, (long)nl[X_TK_NIN].n_value, 0); ! 97: read(mf, &s.tk_nin, sizeof s.tk_nin); ! 98: lseek(mf, (long)nl[X_TK_NOUT].n_value, 0); ! 99: read(mf, &s.tk_nout, sizeof s.tk_nout); ! 100: lseek(mf, (long)nl[X_DK_SEEK].n_value, 0); ! 101: read(mf, s.dk_seek, sizeof s.dk_seek); ! 102: lseek(mf, (long)nl[X_CP_TIME].n_value, 0); ! 103: read(mf, s.cp_time, sizeof s.cp_time); ! 104: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); ! 105: read(mf, s.dk_mspw, sizeof s.dk_mspw); ! 106: for (i = 0; i < DK_NDRIVE; i++) { ! 107: #define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t ! 108: X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time); ! 109: } ! 110: t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t; ! 111: t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t; ! 112: etime = 0; ! 113: for(i=0; i<CPUSTATES; i++) { ! 114: X(cp_time); ! 115: etime += s.cp_time[i]; ! 116: } ! 117: if (etime == 0.0) ! 118: etime = 1.0; ! 119: etime /= 60.0; ! 120: printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime); ! 121: for (i=0; i<DK_NDRIVE; i++) ! 122: if (s.dk_mspw[i] != 0.0) ! 123: stats(i); ! 124: for (i=0; i<CPUSTATES; i++) ! 125: stat1(i); ! 126: printf("\n"); ! 127: contin: ! 128: --iter; ! 129: if(iter) ! 130: if(argc > 1) { ! 131: sleep(atoi(argv[1])); ! 132: goto loop; ! 133: } ! 134: } ! 135: ! 136: stats(dn) ! 137: { ! 138: register i; ! 139: double atime, words, xtime, itime; ! 140: ! 141: if (s.dk_mspw[dn] == 0.0) { ! 142: printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0); ! 143: return; ! 144: } ! 145: atime = s.dk_time[dn]; ! 146: atime /= 60.0; ! 147: words = s.dk_wds[dn]*32.0; /* number of words transferred */ ! 148: xtime = s.dk_mspw[dn]*words; /* transfer time */ ! 149: itime = atime - xtime; /* time not transferring */ ! 150: /* ! 151: printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n", ! 152: dn, words, atime, xtime, itime); ! 153: */ ! 154: if (xtime < 0) ! 155: itime += xtime, xtime = 0; ! 156: if (itime < 0) ! 157: xtime += itime, itime = 0; ! 158: printf("%4.0f", s.dk_seek[dn]/etime); ! 159: printf("%4.0f", s.dk_xfer[dn]/etime); ! 160: printf("%5.1f ", ! 161: s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0); ! 162: /* ! 163: printf("%4.1f", ! 164: s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0); ! 165: */ ! 166: } ! 167: ! 168: stat1(o) ! 169: { ! 170: register i; ! 171: double time; ! 172: ! 173: time = 0; ! 174: for(i=0; i<CPUSTATES; i++) ! 175: time += s.cp_time[i]; ! 176: if (time == 0.0) ! 177: time = 1.0; ! 178: printf("%3.0f", 100*s.cp_time[o]/time); ! 179: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.