BSD 4 release
[unix-history] / usr / src / cmd / vmstat.c
index 0d5244f..f4d245d 100644 (file)
@@ -1,43 +1,47 @@
+static char *sccsid = "@(#)vmstat.c    4.2 (Berkeley) 10/15/80";
 #include <stdio.h>
 #include <sys/param.h>
 #include <sys/vm.h>
 #include <stdio.h>
 #include <sys/param.h>
 #include <sys/vm.h>
+#include <sys/dk.h>
+#include <nlist.h>
 
 
-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
 #ifdef ERNIE
 #define X_REC          10
-       "_rectime",     0, 0,
+       { "_rectime" },
 #define X_PGIN         11
 #define X_PGIN         11
-       "_pgintim",     0, 0,
+       { "_pgintime" },
 #endif
 #endif
-       "\0\0\0\0\0\0\0\0", 0, 0
+       { 0 },
 };
 
 };
 
+double stat1();
 int    firstfree, maxfree;
 int    firstfree, maxfree;
-char   version[128];
 struct
 {
        int     busy;
 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;
        struct  vmmeter Rate;
        struct  vmtotal Total;
        struct  vmmeter Sum;
@@ -52,6 +56,7 @@ struct
 #define        sum             s.Sum
 #define        forkstat        s.Forkstat
 
 #define        sum             s.Sum
 #define        forkstat        s.Forkstat
 
+int    iflag = 1;
 int    zero;
 int    deficit;
 double etime;
 int    zero;
 int    deficit;
 double etime;
@@ -60,17 +65,19 @@ int         mf;
 main(argc, argv)
 char **argv;
 {
 main(argc, argv)
 char **argv;
 {
+       time_t now;
        int lines;
        extern char *ctime();
        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);
        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);
        }
                printf("no /vmunix namelist\n");
                exit(1);
        }
@@ -94,7 +101,7 @@ char **argv;
                case 'z':
                        close(mf);
                        mf = open("/dev/kmem", 2);
                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);
 
                        write(mf, &z.Sum, sizeof z.Sum);
                        exit(0);
 
@@ -106,6 +113,10 @@ char **argv;
                        dosum();
                        exit(0);
 
                        dosum();
                        exit(0);
 
+               case 'i':
+                       iflag = 0;
+                       break;
+
                default:
                        fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
                        exit(1);
                default:
                        fprintf(stderr, "usage: vmstat [ -fs ] [ interval ] [ count]\n");
                        exit(1);
@@ -113,64 +124,99 @@ char **argv;
        }
        if(argc > 1)
                iter = atoi(argv[1]);
        }
        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);
        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);
        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; */
 reprint:
        lines = 20;
        /* s1 = z; */
+       if (iflag==0)
 printf("\
 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:
 ");
 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);
        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);
        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.;
        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(" ");
        etime /= 60.;
        printf(" ");
-       for(i=0; i<3; i++)
-               stats(i);
-       printf("%4d", rate.v_swtch);
        for(i=0; i<4; i++)
        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<CPUSTATES; i++) {
+               float f = stat1(i);
+               if (i == 0) {           /* US+NI */
+                       i++;
+                       f += stat1(i);
+               }
+               printf("%3.0f", f);
+       }
        printf("\n");
        fflush(stdout);
 contin:
        printf("\n");
        fflush(stdout);
 contin:
+       nintv = 1;
        --iter;
        if(iter)
        if(argc > 0) {
        --iter;
        if(iter)
        if(argc > 0) {
@@ -185,11 +231,11 @@ contin:
 dotimes()
 {
 
 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);
        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);
        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);
        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()
 {
 
 dosum()
 {
 
-       lseek(mf, (long)nl[X_SUM].value, 0);
+       lseek(mf, (long)nl[X_SUM].n_value, 0);
        read(mf, &sum, sizeof sum);
        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()
 {
 
 }
 
 
 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,
        read(mf, &forkstat, sizeof forkstat);
        printf("%d forks, %d pages, average=%.2f\n",
                forkstat.cntfork, forkstat.sizfork,
@@ -242,42 +294,28 @@ doforkst()
 
 stats(dn)
 {
 
 stats(dn)
 {
-       register i;
-       double f1, f2;
-       long t;
 
 
-       t = 0;
-       for(i=0; i<32; i++)
-               if(i & (1<<dn))
-                       t += s.etime[i];
-       f1 = t;
-       f1 = f1/60.;
-       f2 = s.numb[dn];
-       if(f2 == 0. && dn) {
-               printf("%3.0f", 0.0);
+       if (dn >= DK_NDRIVE) {
+               printf("  0");
                return;
        }
                return;
        }
-       printf("%3.0f", f2/etime);
+       printf("%3.0f", s.xfer[dn]/etime);
 }
 
 }
 
-stat1(o)
+double
+stat1(row)
 {
 {
+       double t;
        register i;
        register i;
-       long t;
-       double f1, f2;
 
        t = 0;
 
        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<CPUSTATES; i++)
+               t += s.time[i];
+       if(t == 0.)
+               t = 1.;
+       return(s.time[row]*100./t);
 }
 }
+
 pct(top, bot)
 {
 
 pct(top, bot)
 {