|
|
1.1 ! root 1: /* ! 2: * iostat ! 3: */ ! 4: #include <nlist.h> ! 5: #include <sys/dk.h> ! 6: #include "/usr/sys/h/param.h" ! 7: /* this is a botch, fix sys/buf.h */ ! 8: #define KERNEL ! 9: #include "/usr/sys/h/buf.h" ! 10: ! 11: struct nlist nl[] = { ! 12: { "_dk_busy" }, ! 13: #define X_DK_BUSY 0 ! 14: { "_dk_time" }, ! 15: #define X_DK_TIME 1 ! 16: { "_dk_xfer" }, ! 17: #define X_DK_XFER 2 ! 18: { "_dk_wds" }, ! 19: #define X_DK_WDS 3 ! 20: { "_tk_nin" }, ! 21: #define X_TK_NIN 4 ! 22: { "_tk_nout" }, ! 23: #define X_TK_NOUT 5 ! 24: { "_dk_seek" }, ! 25: #define X_DK_SEEK 6 ! 26: { "_cp_time" }, ! 27: #define X_CP_TIME 7 ! 28: { "_dk_mspw" }, ! 29: #define X_DK_MSPW 8 ! 30: { "_io_info" }, ! 31: #define X_DK_INFO 9 ! 32: { "_io_wait" }, ! 33: #define X_IO_WAIT 10 ! 34: { 0 }, ! 35: }; ! 36: struct ! 37: { ! 38: int dk_busy; ! 39: long cp_time[CPUSTATES]; ! 40: long dk_time[DK_NDRIVE]; ! 41: long dk_wds[DK_NDRIVE]; ! 42: long dk_seek[DK_NDRIVE]; ! 43: long dk_xfer[DK_NDRIVE]; ! 44: float dk_mspw[DK_NDRIVE]; ! 45: struct { ! 46: int nbuf; ! 47: long nread, nreada, ncache, nwrite; ! 48: long whyread[W_LAST+1], whycache[W_LAST+1]; ! 49: } io_info; ! 50: long io_wait; ! 51: long tk_nin; ! 52: long tk_nout; ! 53: } s, s1; ! 54: ! 55: int mf; ! 56: double etime; ! 57: ! 58: main(argc, argv) ! 59: char *argv[]; ! 60: { ! 61: extern char *ctime(); ! 62: register i; ! 63: int iter; ! 64: double f1, f2; ! 65: long t; ! 66: int tohdr = 1; ! 67: ! 68: nlist("/vmunix", nl); ! 69: if(nl[X_DK_BUSY].n_type == 0) { ! 70: printf("dk_busy not found in /vmunix namelist\n"); ! 71: exit(1); ! 72: } ! 73: mf = open("/dev/kmem", 0); ! 74: if(mf < 0) { ! 75: printf("cannot open /dev/kmem\n"); ! 76: exit(1); ! 77: } ! 78: iter = 0; ! 79: while (argc>1&&argv[1][0]=='-') { ! 80: argc--; ! 81: argv++; ! 82: } ! 83: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); ! 84: read(mf, s.dk_mspw, sizeof s.dk_mspw); ! 85: if(argc > 2) ! 86: iter = atoi(argv[2]); ! 87: loop: ! 88: if (--tohdr == 0) { ! 89: for (i = 0; i < DK_NDRIVE; i++) ! 90: if (s.dk_mspw[i] != 0.0) ! 91: printf(" D%d ", i); ! 92: printf(" CPU\n"); ! 93: for (i = 0; i < DK_NDRIVE; i++) ! 94: if (s.dk_mspw[i] != 0.0) ! 95: printf(" sps tps msps "); ! 96: printf(" us ni sy id wt\trd\trda\tch\twrt\n"); ! 97: tohdr = 9; ! 98: } ! 99: lseek(mf, (long)nl[X_DK_BUSY].n_value, 0); ! 100: read(mf, &s.dk_busy, sizeof s.dk_busy); ! 101: lseek(mf, (long)nl[X_DK_TIME].n_value, 0); ! 102: read(mf, s.dk_time, sizeof s.dk_time); ! 103: lseek(mf, (long)nl[X_DK_XFER].n_value, 0); ! 104: read(mf, s.dk_xfer, sizeof s.dk_xfer); ! 105: lseek(mf, (long)nl[X_DK_WDS].n_value, 0); ! 106: read(mf, s.dk_wds, sizeof s.dk_wds); ! 107: lseek(mf, (long)nl[X_TK_NIN].n_value, 0); ! 108: read(mf, &s.tk_nin, sizeof s.tk_nin); ! 109: lseek(mf, (long)nl[X_TK_NOUT].n_value, 0); ! 110: read(mf, &s.tk_nout, sizeof s.tk_nout); ! 111: lseek(mf, (long)nl[X_DK_SEEK].n_value, 0); ! 112: read(mf, s.dk_seek, sizeof s.dk_seek); ! 113: lseek(mf, (long)nl[X_CP_TIME].n_value, 0); ! 114: read(mf, s.cp_time, sizeof s.cp_time); ! 115: lseek(mf, (long)nl[X_DK_MSPW].n_value, 0); ! 116: read(mf, s.dk_mspw, sizeof s.dk_mspw); ! 117: lseek(mf, (long)nl[X_DK_INFO].n_value, 0); ! 118: read(mf, (char *)&s.io_info, sizeof s.io_info); ! 119: lseek(mf, (long)nl[X_IO_WAIT].n_value, 0); ! 120: read(mf, (char *)&s.io_wait, sizeof s.io_wait); ! 121: #define sv(x) t = s.x; s.x -= s1.x; s1.x = t; ! 122: for (i = 0; i < DK_NDRIVE; i++) { ! 123: sv(dk_xfer[i]); sv(dk_seek[i]); sv(dk_wds[i]); sv(dk_time[i]); ! 124: } ! 125: sv(tk_nin); ! 126: sv(tk_nout); ! 127: sv(io_info.nread); ! 128: sv(io_info.nreada); ! 129: sv(io_info.ncache); ! 130: sv(io_info.nwrite); ! 131: sv(io_wait); ! 132: for(i = 0; i <= W_LAST; i++) { ! 133: sv(io_info.whyread[i]); ! 134: sv(io_info.whycache[i]); ! 135: } ! 136: etime = 0; ! 137: for(i=0; i<CPUSTATES; i++) { ! 138: sv(cp_time[i]); ! 139: etime += s.cp_time[i]; ! 140: } ! 141: if (etime == 0.0) ! 142: etime = 1.0; ! 143: etime /= 60.0; ! 144: for (i=0; i<DK_NDRIVE; i++) ! 145: if (s.dk_mspw[i] != 0.0) ! 146: stats(i); ! 147: for (i=0; i<CPUSTATES; i++) ! 148: stat1(i); ! 149: printf("%3.0f", s.io_wait*100./60./etime); ! 150: printf("\t%d\t%d\t%d\t%d", s.io_info.nread, s.io_info.nreada, ! 151: s.io_info.ncache, s.io_info.nwrite); ! 152: printf("\n"); ! 153: #define W_FREE 1 ! 154: #define W_INODE 2 ! 155: #define W_INDIR 3 ! 156: #define W_SUPER 4 ! 157: #define W_DATA 5 ! 158: #define W_EXEC 6 ! 159: #define W_BADDR 7 ! 160: #define W_DIREC 8 ! 161: #define W_LAST 8 ! 162: #define xpr(n,i) printf("%ld,%ld:%s ",s.io_info.whyread[i], s.io_info.whycache[i],n); ! 163: xpr("f", 1); xpr("ino", 2); xpr("ind", 3); xpr("s", 4); ! 164: xpr("d", 5); xpr("x", 6); xpr("v", 7); xpr("dir", 8); ! 165: printf("\n"); ! 166: contin: ! 167: --iter; ! 168: if(iter) ! 169: if(argc > 1) { ! 170: sleep(atoi(argv[1])); ! 171: goto loop; ! 172: } ! 173: } ! 174: ! 175: stats(dn) ! 176: { ! 177: register i; ! 178: double atime, words, xtime, itime; ! 179: ! 180: if (s.dk_mspw[dn] == 0.0) { ! 181: printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0); ! 182: return; ! 183: } ! 184: atime = s.dk_time[dn]; ! 185: atime /= 60.0; ! 186: words = s.dk_wds[dn]*32.0; /* number of words transferred */ ! 187: xtime = s.dk_mspw[dn]*words; /* transfer time */ ! 188: itime = atime - xtime; /* time not transferring */ ! 189: /* ! 190: printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n", ! 191: dn, words, atime, xtime, itime); ! 192: */ ! 193: if (xtime < 0) ! 194: itime += xtime, xtime = 0; ! 195: if (itime < 0) ! 196: xtime += itime, itime = 0; ! 197: printf("%4.0f", s.dk_seek[dn]/etime); ! 198: printf("%4.0f", s.dk_xfer[dn]/etime); ! 199: printf("%5.1f ", ! 200: s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0); ! 201: /* ! 202: printf("%4.1f", ! 203: s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0); ! 204: */ ! 205: } ! 206: ! 207: stat1(o) ! 208: { ! 209: register i; ! 210: double time; ! 211: ! 212: time = 0; ! 213: for(i=0; i<CPUSTATES; i++) ! 214: time += s.cp_time[i]; ! 215: if (time == 0.0) ! 216: time = 1.0; ! 217: printf("%3.0f", 100*s.cp_time[o]/time); ! 218: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.