|
|
1.1 ! root 1: static char *sccsid = "@(#)vmstat.c 4.2 (Berkeley) 10/15/80"; ! 2: #include <stdio.h> ! 3: #include <sys/param.h> ! 4: #include <sys/vm.h> ! 5: #include <sys/dk.h> ! 6: #include <nlist.h> ! 7: ! 8: struct nlist nl[] = { ! 9: #define X_CPTIME 0 ! 10: { "_cp_time" }, ! 11: #define X_RATE 1 ! 12: { "_rate" }, ! 13: #define X_TOTAL 2 ! 14: { "_total" }, ! 15: #define X_DEFICIT 3 ! 16: { "_deficit" }, ! 17: #define X_FORKSTAT 4 ! 18: { "_forkstat" }, ! 19: #define X_SUM 5 ! 20: { "_sum" }, ! 21: #define X_FIRSTFREE 6 ! 22: { "_firstfree" }, ! 23: #define X_MAXFREE 7 ! 24: { "_maxfree" }, ! 25: #define X_BOOTIME 8 ! 26: { "_bootime" }, ! 27: #define X_DKXFER 9 ! 28: { "_dk_xfer" }, ! 29: #ifdef ERNIE ! 30: #define X_REC 10 ! 31: { "_rectime" }, ! 32: #define X_PGIN 11 ! 33: { "_pgintime" }, ! 34: #endif ! 35: { 0 }, ! 36: }; ! 37: ! 38: double stat1(); ! 39: int firstfree, maxfree; ! 40: struct ! 41: { ! 42: int busy; ! 43: long time[CPUSTATES]; ! 44: long xfer[DK_NDRIVE]; ! 45: struct vmmeter Rate; ! 46: struct vmtotal Total; ! 47: struct vmmeter Sum; ! 48: struct forkstat Forkstat; ! 49: #ifdef ERNIE ! 50: unsigned rectime; ! 51: unsigned pgintime; ! 52: #endif ! 53: } s, s1, z; ! 54: #define rate s.Rate ! 55: #define total s.Total ! 56: #define sum s.Sum ! 57: #define forkstat s.Forkstat ! 58: ! 59: int iflag = 1; ! 60: int zero; ! 61: int deficit; ! 62: double etime; ! 63: int mf; ! 64: ! 65: main(argc, argv) ! 66: char **argv; ! 67: { ! 68: time_t now; ! 69: int lines; ! 70: extern char *ctime(); ! 71: register i,j; ! 72: int iter, nintv; ! 73: time_t bootime; ! 74: double f1, f2; ! 75: long t; ! 76: extern char _sobuf[]; ! 77: ! 78: setbuf(stdout, _sobuf); ! 79: nlist("/vmunix", nl); ! 80: if(nl[0].n_type == 0) { ! 81: printf("no /vmunix namelist\n"); ! 82: exit(1); ! 83: } ! 84: mf = open("/dev/kmem", 0); ! 85: if(mf < 0) { ! 86: printf("cannot open /dev/kmem\n"); ! 87: exit(1); ! 88: } ! 89: iter = 0; ! 90: argc--, argv++; ! 91: while (argc>0 && argv[0][0]=='-') { ! 92: char *cp = *argv++; ! 93: argc--; ! 94: while (*++cp) switch (*cp) { ! 95: ! 96: #ifdef ERNIE ! 97: case 't': ! 98: dotimes(); ! 99: exit(0); ! 100: #endif ! 101: case 'z': ! 102: close(mf); ! 103: mf = open("/dev/kmem", 2); ! 104: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 105: write(mf, &z.Sum, sizeof z.Sum); ! 106: exit(0); ! 107: ! 108: case 'f': ! 109: doforkst(); ! 110: exit(0); ! 111: ! 112: case 's': ! 113: dosum(); ! 114: exit(0); ! 115: ! 116: case 'i': ! 117: iflag = 0; ! 118: break; ! 119: ! 120: default: ! 121: fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n"); ! 122: exit(1); ! 123: } ! 124: } ! 125: if(argc > 1) ! 126: iter = atoi(argv[1]); ! 127: lseek(mf, (long)nl[X_FIRSTFREE].n_value, 0); ! 128: read(mf, &firstfree, sizeof firstfree); ! 129: lseek(mf, (long)nl[X_MAXFREE].n_value, 0); ! 130: read(mf, &maxfree, sizeof maxfree); ! 131: lseek(mf, (long)nl[X_BOOTIME].n_value, 0); ! 132: read(mf, &bootime, sizeof bootime); ! 133: time(&now); ! 134: nintv = now - bootime; ! 135: if (nintv <= 0 || nintv > 60*60*24*365*10) { ! 136: printf("Time makes no sense... namelist must be wrong.\n"); ! 137: exit(1); ! 138: } ! 139: reprint: ! 140: lines = 20; ! 141: /* s1 = z; */ ! 142: if (iflag==0) ! 143: printf("\ ! 144: Procs Virtual Real Page Swap Disk Cpu\n\ ! 145: RQ DW PW SW AVM TX FRE RE AT PI PO FR DE SR I O D0 D1 D2 D3 CS US SY ID\n\ ! 146: "); ! 147: else ! 148: printf("\ ! 149: Procs Memory Page Swap Disk Faults Cpu\n\ ! 150: R B W AVM FRE RE AT PI PO FR DE SR I O D0 D1 D2 D3 IN SY CS US SY ID\n\ ! 151: "); ! 152: loop: ! 153: lseek(mf, (long)nl[X_CPTIME].n_value, 0); ! 154: read(mf, s.time, sizeof s.time); ! 155: lseek(mf, (long)nl[X_DKXFER].n_value, 0); ! 156: read(mf, s.xfer, sizeof s.xfer); ! 157: if (nintv != 1) { ! 158: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 159: read(mf, &rate, sizeof rate); ! 160: } else { ! 161: lseek(mf, (long)nl[X_RATE].n_value, 0); ! 162: read(mf, &rate, sizeof rate); ! 163: } ! 164: lseek(mf, (long)nl[X_TOTAL].n_value, 0); ! 165: read(mf, &total, sizeof total); ! 166: lseek(mf, (long)nl[X_DEFICIT].n_value, 0); ! 167: read(mf, &deficit, sizeof deficit); ! 168: etime = 0; ! 169: for (i=0; i < DK_NDRIVE; i++) { ! 170: t = s.xfer[i]; ! 171: s.xfer[i] -= s1.xfer[i]; ! 172: s1.xfer[i] = t; ! 173: } ! 174: for (i=0; i < CPUSTATES; i++) { ! 175: t = s.time[i]; ! 176: s.time[i] -= s1.time[i]; ! 177: s1.time[i] = t; ! 178: etime += s.time[i]; ! 179: } ! 180: if(etime == 0.) ! 181: etime = 1.; ! 182: if (iflag) ! 183: printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw, ! 184: total.t_sw); ! 185: else ! 186: printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw, ! 187: total.t_sw); ! 188: if (iflag) ! 189: printf("%6d%5d", total.t_avm/2, total.t_free/2); ! 190: else ! 191: printf("%6d%3d%5d", total.t_avm/2, ! 192: pct(total.t_avmtxt, total.t_avm), total.t_free/2); ! 193: printf("%4d%3d%3d", ! 194: (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv, ! 195: (rate.v_xsfrec+rate.v_xifrec)/nintv, rate.v_pgin/nintv); ! 196: printf("%3d%3d%4d%4.1f%2d%2d", rate.v_pgout/nintv, ! 197: rate.v_dfree/nintv, deficit/2, ! 198: (60.0 * rate.v_scan) / (LOOPSIZ*nintv), ! 199: rate.v_swpin/nintv, rate.v_swpout/nintv); ! 200: etime /= 60.; ! 201: printf(" "); ! 202: for(i=0; i<4; i++) ! 203: stats(i); ! 204: if (iflag) ! 205: printf("%4d%4d", (rate.v_intr/nintv) - HZ, ! 206: rate.v_syscall/nintv); ! 207: printf("%4d", rate.v_swtch/nintv); ! 208: for(i=0; i<CPUSTATES; i++) { ! 209: float f = stat1(i); ! 210: if (i == 0) { /* US+NI */ ! 211: i++; ! 212: f += stat1(i); ! 213: } ! 214: printf("%3.0f", f); ! 215: } ! 216: printf("\n"); ! 217: fflush(stdout); ! 218: contin: ! 219: nintv = 1; ! 220: --iter; ! 221: if(iter) ! 222: if(argc > 0) { ! 223: sleep(atoi(argv[0])); ! 224: if (--lines <= 0) ! 225: goto reprint; ! 226: goto loop; ! 227: } ! 228: } ! 229: ! 230: #ifdef ERNIE ! 231: dotimes() ! 232: { ! 233: ! 234: lseek(mf, (long)nl[X_REC].n_value, 0); ! 235: read(mf, &s.rectime, sizeof s.rectime); ! 236: lseek(mf, (long)nl[X_PGIN].n_value, 0); ! 237: read(mf, &s.pgintime, sizeof s.pgintime); ! 238: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 239: read(mf, &sum, sizeof sum); ! 240: printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime); ! 241: printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec); ! 242: printf("\n"); ! 243: printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10); ! 244: printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0)); ! 245: } ! 246: #endif ! 247: ! 248: dosum() ! 249: { ! 250: ! 251: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 252: read(mf, &sum, sizeof sum); ! 253: printf("%9d swap ins\n", sum.v_swpin); ! 254: printf("%9d swap outs\n", sum.v_swpout); ! 255: printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE); ! 256: printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE); ! 257: printf("%9d total address trans. faults taken\n", sum.v_faults); ! 258: printf("%9d page ins\n", sum.v_pgin); ! 259: printf("%9d page outs\n", sum.v_pgout); ! 260: printf("%9d total reclaims\n", sum.v_pgrec); ! 261: printf("%9d reclaims from free list\n", sum.v_pgfrec); ! 262: printf("%9d intransit blocking page faults\n", sum.v_intrans); ! 263: printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE); ! 264: printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE); ! 265: printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE); ! 266: printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE); ! 267: printf("%9d swap text pages found in free list\n", sum.v_xsfrec); ! 268: printf("%9d inode text pages found in free list\n", sum.v_xifrec); ! 269: printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE); ! 270: printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE); ! 271: printf("%9d pages examined by the clock daemon\n", sum.v_scan); ! 272: printf("%9d revolutions of the clock hand\n", sum.v_rev); ! 273: printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE); ! 274: printf("%9d cpu context switches\n", sum.v_swtch); ! 275: printf("%9d device interrupts\n", sum.v_intr); ! 276: printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma); ! 277: printf("%9d traps\n", sum.v_trap); ! 278: printf("%9d system calls\n", sum.v_syscall); ! 279: } ! 280: ! 281: ! 282: doforkst() ! 283: { ! 284: ! 285: lseek(mf, (long)nl[X_FORKSTAT].n_value, 0); ! 286: read(mf, &forkstat, sizeof forkstat); ! 287: printf("%d forks, %d pages, average=%.2f\n", ! 288: forkstat.cntfork, forkstat.sizfork, ! 289: (float) forkstat.sizfork / forkstat.cntfork); ! 290: printf("%d vforks, %d pages, average=%.2f\n", ! 291: forkstat.cntvfork, forkstat.sizvfork, ! 292: (float)forkstat.sizvfork / forkstat.cntvfork); ! 293: } ! 294: ! 295: stats(dn) ! 296: { ! 297: ! 298: if (dn >= DK_NDRIVE) { ! 299: printf(" 0"); ! 300: return; ! 301: } ! 302: printf("%3.0f", s.xfer[dn]/etime); ! 303: } ! 304: ! 305: double ! 306: stat1(row) ! 307: { ! 308: double t; ! 309: register i; ! 310: ! 311: t = 0; ! 312: for(i=0; i<CPUSTATES; i++) ! 313: t += s.time[i]; ! 314: if(t == 0.) ! 315: t = 1.; ! 316: return(s.time[row]*100./t); ! 317: } ! 318: ! 319: pct(top, bot) ! 320: { ! 321: ! 322: if (bot == 0) ! 323: return (0); ! 324: return ((top * 100) / bot); ! 325: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.