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