X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/2b84abb596f52ab2068d52108adc96838ad4340a..31cef89cb428866f787983e68246030321893df4:/usr/src/cmd/vmstat.c diff --git a/usr/src/cmd/vmstat.c b/usr/src/cmd/vmstat.c index 0d5244f550..f4d245d552 100644 --- a/usr/src/cmd/vmstat.c +++ b/usr/src/cmd/vmstat.c @@ -1,43 +1,47 @@ +static char *sccsid = "@(#)vmstat.c 4.2 (Berkeley) 10/15/80"; #include #include #include +#include +#include -struct -{ - char name[8]; - int type; - unsigned value; -} nl[] = { - "_dk_busy", 0, 0, - "_dk_time", 0, 0, - "_dk_numb", 0, 0, - "_rate", 0, 0, - "_total", 0, 0, - "_deficit", 0, 0, -#define X_FORKSTAT 6 - "_forksta", 0, 0, -#define X_SUM 7 - "_sum", 0, 0, -#define X_FIRSTFREE 8 - "_firstfr", 0, 0, -#define X_MAXFREE 9 - "_maxfree", 0, 0, +struct nlist nl[] = { +#define X_CPTIME 0 + { "_cp_time" }, +#define X_RATE 1 + { "_rate" }, +#define X_TOTAL 2 + { "_total" }, +#define X_DEFICIT 3 + { "_deficit" }, +#define X_FORKSTAT 4 + { "_forkstat" }, +#define X_SUM 5 + { "_sum" }, +#define X_FIRSTFREE 6 + { "_firstfree" }, +#define X_MAXFREE 7 + { "_maxfree" }, +#define X_BOOTIME 8 + { "_bootime" }, +#define X_DKXFER 9 + { "_dk_xfer" }, #ifdef ERNIE #define X_REC 10 - "_rectime", 0, 0, + { "_rectime" }, #define X_PGIN 11 - "_pgintim", 0, 0, + { "_pgintime" }, #endif - "\0\0\0\0\0\0\0\0", 0, 0 + { 0 }, }; +double stat1(); int firstfree, maxfree; -char version[128]; struct { int busy; - long etime[32]; - long numb[3]; + long time[CPUSTATES]; + long xfer[DK_NDRIVE]; struct vmmeter Rate; struct vmtotal Total; struct vmmeter Sum; @@ -52,6 +56,7 @@ struct #define sum s.Sum #define forkstat s.Forkstat +int iflag = 1; int zero; int deficit; double etime; @@ -60,17 +65,19 @@ int mf; main(argc, argv) char **argv; { + time_t now; int lines; extern char *ctime(); - register i; - int iter; + register i,j; + int iter, nintv; + time_t bootime; double f1, f2; long t; extern char _sobuf[]; setbuf(stdout, _sobuf); nlist("/vmunix", nl); - if(nl[0].type == -1) { + if(nl[0].n_type == 0) { printf("no /vmunix namelist\n"); exit(1); } @@ -94,7 +101,7 @@ char **argv; case 'z': close(mf); mf = open("/dev/kmem", 2); - lseek(mf, (long)nl[X_SUM].value, 0); + lseek(mf, (long)nl[X_SUM].n_value, 0); write(mf, &z.Sum, sizeof z.Sum); exit(0); @@ -106,6 +113,10 @@ char **argv; dosum(); exit(0); + case 'i': + iflag = 0; + break; + default: fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n"); exit(1); @@ -113,64 +124,99 @@ char **argv; } if(argc > 1) iter = atoi(argv[1]); - lseek(mf, (long)nl[X_FIRSTFREE].value, 0); + lseek(mf, (long)nl[X_FIRSTFREE].n_value, 0); read(mf, &firstfree, sizeof firstfree); - lseek(mf, (long)nl[X_MAXFREE].value, 0); + lseek(mf, (long)nl[X_MAXFREE].n_value, 0); read(mf, &maxfree, sizeof maxfree); + lseek(mf, (long)nl[X_BOOTIME].n_value, 0); + read(mf, &bootime, sizeof bootime); + time(&now); + nintv = now - bootime; + if (nintv <= 0 || nintv > 60*60*24*365*10) { + printf("Time makes no sense... namelist must be wrong.\n"); + exit(1); + } reprint: lines = 20; /* s1 = z; */ + if (iflag==0) printf("\ - Procs Virtual Real Page Swap Disk Cpu\n\ -RQ DW PW SL SW AVM TX FRE RE PI PO FR DE SR I O D0 D1 D2 CS US NI SY ID\n\ + Procs Virtual Real Page Swap Disk Cpu\n\ +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\ +"); + else +printf("\ + Procs Memory Page Swap Disk Faults Cpu\n\ + 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\ "); loop: - lseek(mf, (long)nl[0].value, 0); - read(mf, &s.busy, sizeof s.busy); - lseek(mf, (long)nl[1].value, 0); - read(mf, s.etime, sizeof s.etime); - lseek(mf, (long)nl[2].value, 0); - read(mf, s.numb, sizeof s.numb); - lseek(mf, (long)nl[3].value, 0); - read(mf, &rate, sizeof rate); - lseek(mf, (long)nl[4].value, 0); + lseek(mf, (long)nl[X_CPTIME].n_value, 0); + read(mf, s.time, sizeof s.time); + lseek(mf, (long)nl[X_DKXFER].n_value, 0); + read(mf, s.xfer, sizeof s.xfer); + if (nintv != 1) { + lseek(mf, (long)nl[X_SUM].n_value, 0); + read(mf, &rate, sizeof rate); + } else { + lseek(mf, (long)nl[X_RATE].n_value, 0); + read(mf, &rate, sizeof rate); + } + lseek(mf, (long)nl[X_TOTAL].n_value, 0); read(mf, &total, sizeof total); - lseek(mf, (long)nl[5].value, 0); + lseek(mf, (long)nl[X_DEFICIT].n_value, 0); read(mf, &deficit, sizeof deficit); - for(i=0; i<35; i++) { - t = s.etime[i]; - s.etime[i] -= s1.etime[i]; - s1.etime[i] = t; + etime = 0; + for (i=0; i < DK_NDRIVE; i++) { + t = s.xfer[i]; + s.xfer[i] -= s1.xfer[i]; + s1.xfer[i] = t; + } + for (i=0; i < CPUSTATES; i++) { + t = s.time[i]; + s.time[i] -= s1.time[i]; + s1.time[i] = t; + etime += s.time[i]; } - t = 0; - for(i=0; i<32; i++) - t += s.etime[i]; - etime = t; if(etime == 0.) etime = 1.; -/* - Procs Virtual Real Page Swap Disk Cpu -RQ DW PW SL SW AVM TX FRE RE PI PO FR DE SR I O D0 D1 D2 CS US NI SY ID -*/ - printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw, - total.t_sl, total.t_sw); - printf("%6d%3d%5d", total.t_avm, pct(total.t_avmtxt, total.t_avm), - total.t_free); - printf("%4d%3d", rate.v_pgrec, rate.v_pgin); - printf("%3d%3d%4d%4.1f%2d%2d", - rate.v_pgout, rate.v_dfree, deficit, - (60.0 * rate.v_scan) / LOOPSIZ, - rate.v_swpin, rate.v_swpout); + if (iflag) + printf("%2d%2d%2d", total.t_rq, total.t_dw+total.t_pw, + total.t_sw); + else + printf("%2d%3d%3d%3d%3d", total.t_rq, total.t_dw, total.t_pw, + total.t_sw); + if (iflag) + printf("%6d%5d", total.t_avm/2, total.t_free/2); + else + printf("%6d%3d%5d", total.t_avm/2, + pct(total.t_avmtxt, total.t_avm), total.t_free/2); + printf("%4d%3d%3d", + (rate.v_pgrec - (rate.v_xsfrec+rate.v_xifrec))/nintv, + (rate.v_xsfrec+rate.v_xifrec)/nintv, rate.v_pgin/nintv); + printf("%3d%3d%4d%4.1f%2d%2d", rate.v_pgout/nintv, + rate.v_dfree/nintv, deficit/2, + (60.0 * rate.v_scan) / (LOOPSIZ*nintv), + rate.v_swpin/nintv, rate.v_swpout/nintv); etime /= 60.; printf(" "); - for(i=0; i<3; i++) - stats(i); - printf("%4d", rate.v_swtch); for(i=0; i<4; i++) - stat1(i*8); + stats(i); + if (iflag) + printf("%4d%4d", (rate.v_intr/nintv) - HZ, + rate.v_syscall/nintv); + printf("%4d", rate.v_swtch/nintv); + for(i=0; i 0) { @@ -185,11 +231,11 @@ contin: dotimes() { - lseek(mf, (long)nl[X_REC].value, 0); + lseek(mf, (long)nl[X_REC].n_value, 0); read(mf, &s.rectime, sizeof s.rectime); - lseek(mf, (long)nl[X_PGIN].value, 0); + lseek(mf, (long)nl[X_PGIN].n_value, 0); read(mf, &s.pgintime, sizeof s.pgintime); - lseek(mf, (long)nl[X_SUM].value, 0); + lseek(mf, (long)nl[X_SUM].n_value, 0); read(mf, &sum, sizeof sum); printf("%d reclaims, %d total time (usec)\n", sum.v_pgrec, s.rectime); printf("average: %d usec / reclaim\n", s.rectime/sum.v_pgrec); @@ -202,35 +248,41 @@ dotimes() dosum() { - lseek(mf, (long)nl[X_SUM].value, 0); + lseek(mf, (long)nl[X_SUM].n_value, 0); read(mf, &sum, sizeof sum); - printf("%8d swap ins\n", sum.v_swpin); - printf("%8d swap outs\n", sum.v_swpout); - printf("%8d pages swapped in\n", sum.v_pswpin); - printf("%8d pages swapped out\n", sum.v_pswpout); - printf("%8d total address trans. faults taken\n", sum.v_faults); - printf("%8d page ins\n", sum.v_pgin); - printf("%8d page outs\n", sum.v_pgout); - printf("%8d total reclaims\n", sum.v_pgrec); - printf("%8d reclaims from free list\n", sum.v_pgfrec); - printf("%8d intransit blocking page faults\n", sum.v_intrans); - printf("%8d zero fill on demand page faults\n", sum.v_zfod / CLSIZE); - printf("%8d total zero fill pages created\n", sum.v_nzfod); - printf("%8d executable fill on demand page faults\n", sum.v_exfod / CLSIZE); - printf("%8d total executable fill pages created\n", sum.v_nexfod); - printf("%8d file fill on demand page faults\n", sum.v_vrfod / CLSIZE); - printf("%8d total pages set up for fill on demand with vread\n", sum.v_nvrfod); - printf("%8d pages examined by the clock daemon\n", sum.v_scan); - printf("%8d revolutions of the clock hand\n", sum.v_rev); - printf("%8d pages freed by the clock daemon\n", sum.v_dfree); - printf("%8d cpu context switches\n", sum.v_swtch); + printf("%9d swap ins\n", sum.v_swpin); + printf("%9d swap outs\n", sum.v_swpout); + printf("%9d pages swapped in\n", sum.v_pswpin / CLSIZE); + printf("%9d pages swapped out\n", sum.v_pswpout / CLSIZE); + printf("%9d total address trans. faults taken\n", sum.v_faults); + printf("%9d page ins\n", sum.v_pgin); + printf("%9d page outs\n", sum.v_pgout); + printf("%9d total reclaims\n", sum.v_pgrec); + printf("%9d reclaims from free list\n", sum.v_pgfrec); + printf("%9d intransit blocking page faults\n", sum.v_intrans); + printf("%9d zero fill pages created\n", sum.v_nzfod / CLSIZE); + printf("%9d zero fill page faults\n", sum.v_zfod / CLSIZE); + printf("%9d executable fill pages created\n", sum.v_nexfod / CLSIZE); + printf("%9d executable fill page faults\n", sum.v_exfod / CLSIZE); + printf("%9d swap text pages found in free list\n", sum.v_xsfrec); + printf("%9d inode text pages found in free list\n", sum.v_xifrec); + printf("%9d file fill pages created\n", sum.v_nvrfod / CLSIZE); + printf("%9d file fill page faults\n", sum.v_vrfod / CLSIZE); + printf("%9d pages examined by the clock daemon\n", sum.v_scan); + printf("%9d revolutions of the clock hand\n", sum.v_rev); + printf("%9d pages freed by the clock daemon\n", sum.v_dfree / CLSIZE); + printf("%9d cpu context switches\n", sum.v_swtch); + printf("%9d device interrupts\n", sum.v_intr); + printf("%9d pseduo-dma dz interrupts\n", sum.v_pdma); + printf("%9d traps\n", sum.v_trap); + printf("%9d system calls\n", sum.v_syscall); } doforkst() { - lseek(mf, (long)nl[X_FORKSTAT].value, 0); + lseek(mf, (long)nl[X_FORKSTAT].n_value, 0); read(mf, &forkstat, sizeof forkstat); printf("%d forks, %d pages, average=%.2f\n", forkstat.cntfork, forkstat.sizfork, @@ -242,42 +294,28 @@ doforkst() stats(dn) { - register i; - double f1, f2; - long t; - t = 0; - for(i=0; i<32; i++) - if(i & (1<= DK_NDRIVE) { + printf(" 0"); return; } - printf("%3.0f", f2/etime); + printf("%3.0f", s.xfer[dn]/etime); } -stat1(o) +double +stat1(row) { + double t; register i; - long t; - double f1, f2; t = 0; - for(i=0; i<32; i++) - t += s.etime[i]; - f1 = t; - if(f1 == 0.) - f1 = 1.; - t = 0; - for(i=0; i<8; i++) - t += s.etime[o+i]; - f2 = t; - printf("%3.0f", f2*100./f1); + for(i=0; i