|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <libc.h> ! 3: #include <sys/param.h> ! 4: #include <sys/vm.h> ! 5: #include <nlist.h> ! 6: #include <sys/meter.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_SUM 4 ! 18: { "_sum" }, ! 19: #define X_FIRSTFREE 5 ! 20: { "_firstfree" }, ! 21: #define X_MAXFREE 6 ! 22: { "_maxfree" }, ! 23: #define X_BOOTIME 7 ! 24: { "_bootime" }, ! 25: #define X_REC 8 ! 26: { "_rectime" }, ! 27: #define X_PGIN 9 ! 28: { "_pgintime" }, ! 29: { 0 }, ! 30: }; ! 31: ! 32: double stat1(); ! 33: int firstfree, maxfree; ! 34: struct ! 35: { ! 36: int busy; ! 37: long time[CPUSTATES]; ! 38: struct vmmeter Rate; ! 39: struct vmtotal Total; ! 40: struct vmmeter Sum; ! 41: unsigned rectime; ! 42: unsigned pgintime; ! 43: } s, s1, z; ! 44: #define rate s.Rate ! 45: #define total s.Total ! 46: #define sum s.Sum ! 47: ! 48: int zero; ! 49: int deficit; ! 50: double etime; ! 51: int mf; ! 52: ! 53: main(argc, argv) ! 54: char **argv; ! 55: { ! 56: time_t now; ! 57: int lines; ! 58: extern char *ctime(); ! 59: register i; ! 60: int iter, nintv; ! 61: time_t bootime; ! 62: long t; ! 63: extern char _sobuf[]; ! 64: ! 65: setbuf(stdout, _sobuf); ! 66: nlist("/unix", nl); ! 67: if(nl[0].n_type == 0) { ! 68: printf("no /unix namelist\n"); ! 69: exit(1); ! 70: } ! 71: mf = open("/dev/kmem", 0); ! 72: if(mf < 0) { ! 73: printf("cannot open /dev/kmem\n"); ! 74: exit(1); ! 75: } ! 76: iter = 0; ! 77: argc--, argv++; ! 78: while (argc>0 && argv[0][0]=='-') { ! 79: char *cp = *argv++; ! 80: argc--; ! 81: while (*++cp) switch (*cp) { ! 82: ! 83: case 't': ! 84: dotimes(); ! 85: exit(0); ! 86: case 'z': ! 87: close(mf); ! 88: mf = open("/dev/kmem", 2); ! 89: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 90: write(mf, &z.Sum, sizeof z.Sum); ! 91: exit(0); ! 92: ! 93: ! 94: case 's': ! 95: dosum(); ! 96: exit(0); ! 97: ! 98: default: ! 99: fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n"); ! 100: exit(1); ! 101: } ! 102: } ! 103: if(argc > 1) ! 104: iter = atoi(argv[1]); ! 105: lseek(mf, (long)nl[X_FIRSTFREE].n_value, 0); ! 106: read(mf, &firstfree, sizeof firstfree); ! 107: lseek(mf, (long)nl[X_MAXFREE].n_value, 0); ! 108: read(mf, &maxfree, sizeof maxfree); ! 109: lseek(mf, (long)nl[X_BOOTIME].n_value, 0); ! 110: read(mf, &bootime, sizeof bootime); ! 111: time(&now); ! 112: nintv = now - bootime; ! 113: if (nintv <= 0 || nintv > 60*60*24*365*10) { ! 114: printf("Time makes no sense... namelist must be wrong.\n"); ! 115: exit(1); ! 116: } ! 117: reprint: ! 118: lines = 20; ! 119: /* s1 = z; */ ! 120: printf("\ ! 121: procs| memory | page | | cpu\n\ ! 122: r b w avm fre re at pi po fr de sr sy cs us sy id st\n"); ! 123: loop: ! 124: lseek(mf, (long)nl[X_CPTIME].n_value, 0); ! 125: read(mf, s.time, sizeof s.time); ! 126: if (nintv != 1) { ! 127: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 128: read(mf, &rate, sizeof rate); ! 129: } else { ! 130: lseek(mf, (long)nl[X_RATE].n_value, 0); ! 131: read(mf, &rate, sizeof rate); ! 132: } ! 133: lseek(mf, (long)nl[X_TOTAL].n_value, 0); ! 134: read(mf, &total, sizeof total); ! 135: lseek(mf, (long)nl[X_DEFICIT].n_value, 0); ! 136: read(mf, &deficit, sizeof deficit); ! 137: etime = 0; ! 138: for (i=0; i < CPUSTATES; i++) { ! 139: t = s.time[i]; ! 140: s.time[i] -= s1.time[i]; ! 141: s1.time[i] = t; ! 142: etime += s.time[i]; ! 143: } ! 144: if(etime == 0.) ! 145: etime = 1.; ! 146: printf("%2d %d %d", total.t_rq, total.t_dw+total.t_pw, total.t_sw); ! 147: printf(" %6d %6d", total.t_avm/CLSIZE, total.t_free/CLSIZE); ! 148: printf(" %3d %3d %3d", ! 149: (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv, ! 150: (rate.v_xsfrec+rate.v_xifrec)/nintv, rate.v_pgpgin/CLSIZE/nintv); ! 151: printf(" %3d %3d %3d %3d", rate.v_pgpgout/CLSIZE/nintv, ! 152: rate.v_dfree/CLSIZE/nintv, deficit/CLSIZE, rate.v_scan/nintv); ! 153: etime /= 60.; ! 154: printf(" %3d", rate.v_syscall/nintv); ! 155: printf(" %3d", rate.v_swtch/nintv); ! 156: for(i=0; i<CPUSTATES; i++) { ! 157: float f = stat1(i); ! 158: if (i == 0) { /* US+NI */ ! 159: i++; ! 160: f += stat1(i); ! 161: } ! 162: printf("%3.0f", f); ! 163: } ! 164: printf("\n"); ! 165: fflush(stdout); ! 166: nintv = 1; ! 167: --iter; ! 168: if(iter) ! 169: if(argc > 0) { ! 170: sleep(atoi(argv[0])); ! 171: if (--lines <= 0) ! 172: goto reprint; ! 173: goto loop; ! 174: } ! 175: } ! 176: ! 177: dotimes() ! 178: { ! 179: ! 180: lseek(mf, (long)nl[X_REC].n_value, 0); ! 181: read(mf, &s.rectime, sizeof s.rectime); ! 182: lseek(mf, (long)nl[X_PGIN].n_value, 0); ! 183: read(mf, &s.pgintime, sizeof s.pgintime); ! 184: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 185: read(mf, &sum, sizeof sum); ! 186: printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime); ! 187: printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec); ! 188: printf("\n"); ! 189: printf("%d page ins, %d total time (msec)\n",sum.v_pgin, s.pgintime/10); ! 190: printf("average: %8.1f msec / page in\n", s.pgintime/(sum.v_pgin*10.0)); ! 191: } ! 192: ! 193: dosum() ! 194: { ! 195: ! 196: lseek(mf, (long)nl[X_SUM].n_value, 0); ! 197: read(mf, &sum, sizeof sum); ! 198: printf("%9d swap ins\n", sum.v_swpin); ! 199: printf("%9d swap outs\n", sum.v_swpout); ! 200: printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE); ! 201: printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE); ! 202: printf("%9d total address trans. faults taken\n", sum.v_faults); ! 203: printf("%9d page ins\n", sum.v_pgin); ! 204: printf("%9d page outs\n", sum.v_pgout); ! 205: printf("%9d pages paged in\n", sum.v_pgpgin); ! 206: printf("%9d pages paged out\n", sum.v_pgpgout); ! 207: printf("%9d sequential process pages freed\n", sum.v_seqfree); ! 208: printf("%9d total reclaims\n", sum.v_pgrec); ! 209: printf("%9d reclaims from free list\n", sum.v_pgfrec); ! 210: printf("%9d intransit blocking page faults\n", sum.v_intrans); ! 211: printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE); ! 212: printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE); ! 213: printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE); ! 214: printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE); ! 215: printf("%9d swap text pages found in free list\n", sum.v_xsfrec); ! 216: printf("%9d inode text pages found in free list\n", sum.v_xifrec); ! 217: printf("%9d pages examined by the clock daemon\n", sum.v_scan); ! 218: printf("%9d revolutions of the clock hand\n", sum.v_rev); ! 219: printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE); ! 220: printf("%9d cpu context switches\n", sum.v_swtch); ! 221: printf("%9d traps\n", sum.v_trap); ! 222: printf("%9d system calls\n", sum.v_syscall); ! 223: } ! 224: ! 225: double ! 226: stat1(row) ! 227: { ! 228: double t; ! 229: register i; ! 230: ! 231: t = 0; ! 232: for(i=0; i<CPUSTATES; i++) ! 233: t += s.time[i]; ! 234: if(t == 0.) ! 235: t = 1.; ! 236: return(s.time[row]*100./t); ! 237: } ! 238: ! 239: pct(top, bot) ! 240: { ! 241: ! 242: if (bot == 0) ! 243: return (0); ! 244: return ((top * 100) / bot); ! 245: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.