|
|
1.1 ! root 1: int bflg; ! 2: int dflg; ! 3: int tflg = 1; ! 4: int iflg; ! 5: int aflg; ! 6: int sflg; ! 7: struct ! 8: { ! 9: char name[8]; ! 10: int type; ! 11: unsigned value; ! 12: } nl[] = { ! 13: "_dk_busy", 0, 0, ! 14: "_dk_time", 0, 0, ! 15: "_dk_numb", 0, 0, ! 16: "_dk_wds", 0, 0, ! 17: "_tk_nin", 0, 0, ! 18: "_tk_nout", 0, 0, ! 19: "_io_info", 0, 0, ! 20: "\0\0\0\0\0\0\0\0", 0, 0 ! 21: }; ! 22: struct ! 23: { ! 24: int busy; ! 25: long etime[32]; ! 26: long numb[3]; ! 27: long wds[3]; ! 28: long tin; ! 29: long tout; ! 30: } s, s1; ! 31: ! 32: struct iostat { ! 33: int nbuf; ! 34: long nread; ! 35: long nreada; ! 36: long ncache; ! 37: long nwrite; ! 38: long bufcount[50]; ! 39: } io_info, io_delta; ! 40: double etime; ! 41: ! 42: int mf; ! 43: ! 44: main(argc, argv) ! 45: char *argv[]; ! 46: { ! 47: extern char *ctime(); ! 48: register i; ! 49: int iter; ! 50: double f1, f2; ! 51: long t; ! 52: ! 53: nlist("/vmunix", nl); ! 54: if(nl[0].type == -1) { ! 55: printf("dk_busy not found in /vmunix namelist\n"); ! 56: exit(1); ! 57: } ! 58: mf = open("/dev/kmem", 0); ! 59: if(mf < 0) { ! 60: printf("cannot open /dev/kmem\n"); ! 61: exit(1); ! 62: } ! 63: iter = 0; ! 64: while (argc>1&&argv[1][0]=='-') { ! 65: if (argv[1][1]=='d') ! 66: dflg++; ! 67: else if (argv[1][1]=='s') ! 68: sflg++; ! 69: else if (argv[1][1]=='a') ! 70: aflg++; ! 71: else if (argv[1][1]=='t') ! 72: tflg++; ! 73: else if (argv[1][1]=='i') ! 74: iflg++; ! 75: else if (argv[1][1]=='b') ! 76: bflg++, tflg = 0; ! 77: argc--; ! 78: argv++; ! 79: } ! 80: if(argc > 2) ! 81: iter = atoi(argv[2]); ! 82: if (!(sflg|iflg)) { ! 83: if(tflg) ! 84: printf(" TTY"); ! 85: if (bflg==0) ! 86: printf(" RP RM PERCENT\n"); ! 87: if(tflg) ! 88: printf(" tin tout"); ! 89: if (bflg==0) ! 90: printf(" spm tpm msps mspt tpm msps mspt user nice systm idle\n"); ! 91: } ! 92: ! 93: loop: ! 94: lseek(mf, (long)nl[0].value, 0); ! 95: read(mf, &s.busy, sizeof s.busy); ! 96: lseek(mf, (long)nl[1].value, 0); ! 97: read(mf, s.etime, sizeof s.etime); ! 98: lseek(mf, (long)nl[2].value, 0); ! 99: read(mf, s.numb, sizeof s.numb); ! 100: lseek(mf, (long)nl[3].value, 0); ! 101: read(mf, s.wds, sizeof s.wds); ! 102: lseek(mf, (long)nl[4].value, 0); ! 103: read(mf, &s.tin, sizeof s.tin); ! 104: lseek(mf, (long)nl[5].value, 0); ! 105: read(mf, &s.tout, sizeof s.tout); ! 106: for(i=0; i<40; i++) { ! 107: t = s.etime[i]; ! 108: s.etime[i] -= s1.etime[i]; ! 109: s1.etime[i] = t; ! 110: } ! 111: t = 0; ! 112: for(i=0; i<32; i++) ! 113: t += s.etime[i]; ! 114: etime = t; ! 115: if(etime == 0.) ! 116: etime = 1.; ! 117: if (bflg) { ! 118: biostats(); ! 119: goto contin; ! 120: } ! 121: if (dflg) { ! 122: long tm; ! 123: time(&tm); ! 124: printf("%s", ctime(&tm)); ! 125: } ! 126: if (aflg) ! 127: printf("%.2f minutes total\n", etime/3600); ! 128: if (sflg) { ! 129: stats2(etime); ! 130: goto contin; ! 131: } ! 132: if (iflg) { ! 133: stats3(etime); ! 134: goto contin; ! 135: } ! 136: etime /= 60.; ! 137: if(tflg) { ! 138: f1 = s.tin; ! 139: f2 = s.tout; ! 140: printf("%6.1f", f1/etime); ! 141: printf("%6.1f", f2/etime); ! 142: } ! 143: for(i=0; i<3; i++) ! 144: stats(i); ! 145: for(i=0; i<4; i++) ! 146: stat1(i*8); ! 147: printf("\n"); ! 148: contin: ! 149: --iter; ! 150: if(iter) ! 151: if(argc > 1) { ! 152: sleep(atoi(argv[1])); ! 153: goto loop; ! 154: } ! 155: } ! 156: ! 157: /* usec per word for the various disks */ ! 158: double xf[] = { ! 159: 2.48, /* RP06 */ ! 160: 2.48, /* RP06 */ ! 161: 1.66, /* RM03 */ ! 162: 16.0, /* RF */ ! 163: 11.1, /* RK03/05 */ ! 164: }; ! 165: ! 166: stats(dn) ! 167: { ! 168: register i; ! 169: double f1, f2, f3; ! 170: double f4, f5, f6; ! 171: long t; ! 172: static float zerof5; ! 173: ! 174: t = 0; ! 175: for(i=0; i<32; i++) ! 176: if(i & (1<<dn)) ! 177: t += s.etime[i]; ! 178: f1 = t; ! 179: f1 = f1/60.; ! 180: f2 = s.numb[dn]; ! 181: if(f2 == 0. && dn) { ! 182: printf("%6.0f%6.1f%6.1f", 0.0, 0.0, 0.0); ! 183: return; ! 184: } ! 185: f3 = s.wds[dn]; ! 186: f3 = f3*32.; ! 187: f4 = xf[dn]; ! 188: f4 = f4*1.0e-6; ! 189: f5 = f1 - f4*f3; ! 190: f6 = f1 - f5; ! 191: if (dn == 0) { ! 192: if (s.numb[0] == 0) { ! 193: f2 = s.numb[0] = 1; ! 194: s.wds[0] = 0; ! 195: } ! 196: printf("%6.0f", s.numb[0]*60./etime); ! 197: zerof5 = f5*1000./f2; ! 198: return; ! 199: } ! 200: printf("%6.0f", f2*60./etime); ! 201: if (dn == 1) /* hack together seek time for rp */ ! 202: printf("%6.1f", f5*1000./f2 + zerof5); ! 203: else ! 204: printf("%6.1f", f5*1000./f2); ! 205: printf("%6.1f", f6*1000./f2); ! 206: } ! 207: ! 208: stat1(o) ! 209: { ! 210: register i; ! 211: long t; ! 212: double f1, f2; ! 213: ! 214: t = 0; ! 215: for(i=0; i<32; i++) ! 216: t += s.etime[i]; ! 217: f1 = t; ! 218: if(f1 == 0.) ! 219: f1 = 1.; ! 220: t = 0; ! 221: for(i=0; i<8; i++) ! 222: t += s.etime[o+i]; ! 223: f2 = t; ! 224: printf("%6.2f", f2*100./f1); ! 225: } ! 226: ! 227: stats2(t) ! 228: double t; ! 229: { ! 230: register i, j; ! 231: ! 232: for (i=0; i<4; i++) { ! 233: for (j=0; j<8; j++) ! 234: printf("%6.2f\n", s.etime[8*i+j]/(t/100)); ! 235: printf("\n"); ! 236: } ! 237: } ! 238: ! 239: stats3(t) ! 240: double t; ! 241: { ! 242: register i; ! 243: double sum; ! 244: ! 245: t /= 100; ! 246: printf("%6.2f idle\n", s.etime[24]/t); ! 247: sum = 0; ! 248: for (i=0; i<8; i++) ! 249: sum += s.etime[i]; ! 250: printf("%6.2f user\n", sum/t); ! 251: sum = 0; ! 252: for (i=0; i<8; i++) ! 253: sum += s.etime[8+i]; ! 254: printf("%6.2f nice\n", sum/t); ! 255: sum = 0; ! 256: for (i=0; i<8; i++) ! 257: sum += s.etime[16+i]; ! 258: printf("%6.2f system\n", sum/t); ! 259: sum = 0; ! 260: for (i=1; i<8; i++) ! 261: sum += s.etime[24+i]; ! 262: printf("%6.2f IO wait\n", sum/t); ! 263: sum = 0; ! 264: for (i=1; i<8; i++) ! 265: sum += s.etime[i]+s.etime[i+8]+s.etime[i+16]+s.etime[i+24]; ! 266: printf("%6.2f IO active\n", sum/t); ! 267: sum = 0; ! 268: for (i=0; i<32; i++) ! 269: if (i&01) ! 270: sum += s.etime[i]; ! 271: printf("%6.2f RP seek\n", sum/t); ! 272: sum = 0; ! 273: for (i=0; i<32; i++) ! 274: if (i&02) ! 275: sum += s.etime[i]; ! 276: printf("%6.2f RP transfer\n", sum/t); ! 277: /* ! 278: sum = 0; ! 279: for (i=0; i<32; i++) ! 280: if (i&04) ! 281: sum += s.etime[i]; ! 282: printf("%6.2f RP active\n", sum/t); ! 283: */ ! 284: } ! 285: ! 286: biostats() ! 287: { ! 288: register i; ! 289: ! 290: lseek(mf,(long)nl[6].value, 0); ! 291: read(mf, (char *)&io_info, sizeof(io_info)); ! 292: printf("%D\t%D\t%D\t%D\n", ! 293: io_info.nread-io_delta.nread, io_info.nreada-io_delta.nreada, ! 294: io_info.ncache-io_delta.ncache, io_info.nwrite-io_delta.nwrite); ! 295: ! 296: for(i=0; i<30; ) { ! 297: printf("%D\t",(long)io_info.bufcount[i]-io_delta.bufcount[i]); ! 298: i++; ! 299: if (i % 10 == 0) ! 300: printf("\n"); ! 301: } ! 302: io_delta = io_info; ! 303: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.