BSD 4 release
[unix-history] / usr / src / cmd / iostat.c
index 8e03f88..79579ed 100644 (file)
@@ -1,40 +1,46 @@
-int    bflg;
-int    dflg;
-int    tflg;
-int    iflg;
-int    aflg;
-int    sflg;
-struct
-{
-       char    name[8];
-       int     type;
-       unsigned        value;
-} nl[] = {
-       "_dk_busy", 0, 0,
-       "_io_info", 0, 0,
-       "\0\0\0\0\0\0\0\0", 0, 0
+static char *sccsid = "@(#)iostat.c    4.2 (Berkeley) 10/19/80";
+/*
+ * iostat
+ */
+#include <nlist.h>
+#include <sys/dk.h>
+
+struct nlist nl[] = {
+       { "_dk_busy" },
+#define        X_DK_BUSY       0
+       { "_dk_time" },
+#define        X_DK_TIME       1
+       { "_dk_xfer" },
+#define        X_DK_XFER       2
+       { "_dk_wds" },
+#define        X_DK_WDS        3
+       { "_tk_nin" },
+#define        X_TK_NIN        4
+       { "_tk_nout" },
+#define        X_TK_NOUT       5
+       { "_dk_seek" },
+#define        X_DK_SEEK       6
+       { "_cp_time" },
+#define        X_CP_TIME       7
+       { "_dk_mspw" },
+#define        X_DK_MSPW       8
+       { 0 },
 };
 struct
 {
 };
 struct
 {
-       int     busy;
-       long    etime[32];
-       long    numb[3];
-       long    wds[3];
-       long    tin;
-       long    tout;
+       int     dk_busy;
+       long    cp_time[CPUSTATES];
+       long    dk_time[DK_NDRIVE];
+       long    dk_wds[DK_NDRIVE];
+       long    dk_seek[DK_NDRIVE];
+       long    dk_xfer[DK_NDRIVE];
+       float   dk_mspw[DK_NDRIVE];
+       long    tk_nin;
+       long    tk_nout;
 } s, s1;
 
 } s, s1;
 
-struct iostat {
-       int     nbuf;
-       long    nread;
-       long    nreada;
-       long    ncache;
-       long    nwrite;
-       long    bufcount[50];
-} io_info, io_delta;
-double etime;
-
 int    mf;
 int    mf;
+double etime;
 
 main(argc, argv)
 char *argv[];
 
 main(argc, argv)
 char *argv[];
@@ -44,10 +50,11 @@ char *argv[];
        int iter;
        double f1, f2;
        long t;
        int iter;
        double f1, f2;
        long t;
+       int tohdr = 1;
 
 
-       nlist("/unix", nl);
-       if(nl[0].type == -1) {
-               printf("dk_busy not found in /unix namelist\n");
+       nlist("/vmunix", nl);
+       if(nl[X_DK_BUSY].n_type == 0) {
+               printf("dk_busy not found in /vmunix namelist\n");
                exit(1);
        }
        mf = open("/dev/kmem", 0);
                exit(1);
        }
        mf = open("/dev/kmem", 0);
@@ -57,78 +64,65 @@ char *argv[];
        }
        iter = 0;
        while (argc>1&&argv[1][0]=='-') {
        }
        iter = 0;
        while (argc>1&&argv[1][0]=='-') {
-               if (argv[1][1]=='d')
-                       dflg++;
-               else if (argv[1][1]=='s')
-                       sflg++;
-               else if (argv[1][1]=='a')
-                       aflg++;
-               else if (argv[1][1]=='t')
-                       tflg++;
-               else if (argv[1][1]=='i')
-                       iflg++;
-               else if (argv[1][1]=='b')
-                       bflg++;
                argc--;
                argv++;
        }
                argc--;
                argv++;
        }
+       lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
+       read(mf, s.dk_mspw, sizeof s.dk_mspw);
        if(argc > 2)
                iter = atoi(argv[2]);
        if(argc > 2)
                iter = atoi(argv[2]);
-       if (!(sflg|iflg)) {
-       if(tflg)
-               printf("         TTY");
-       if (bflg==0)
-       printf("   RF                RK                RP                  PERCENT\n");
-       if(tflg)
-               printf("   tin  tout");
-       if (bflg==0)
-       printf("   tpm  msps  mspt   tpm  msps  mspt   tpm  msps  mspt  user  nice systm  idle\n");
-       }
-
 loop:
 loop:
-       lseek(mf, (long)nl[0].value, 0);
-       read(mf, (char *)&s, sizeof s);
-       for(i=0; i<40; i++) {
-               t = s.etime[i];
-               s.etime[i] -= s1.etime[i];
-               s1.etime[i] = t;
-       }
-       t = 0;
-       for(i=0; i<32; i++)
-               t += s.etime[i];
-       etime = t;
-       if(etime == 0.)
-               etime = 1.;
-       if (bflg) {
-               biostats();
-               goto contin;
+       if (--tohdr == 0) {
+               printf("      TTY");
+               for (i = 0; i < DK_NDRIVE; i++)
+                       if (s.dk_mspw[i] != 0.0)
+                               printf("           D%d ", i);
+               printf("         CPU\n");
+               printf(" tin tout");
+               for (i = 0; i < DK_NDRIVE; i++)
+                       if (s.dk_mspw[i] != 0.0)
+                               printf(" sps tps msps ");
+               printf(" us ni sy id\n");
+               tohdr = 19;
        }
        }
-       if (dflg) {
-               long tm;
-               time(&tm);
-               printf("%s", ctime(&tm));
+       lseek(mf, (long)nl[X_DK_BUSY].n_value, 0);
+       read(mf, &s.dk_busy, sizeof s.dk_busy);
+       lseek(mf, (long)nl[X_DK_TIME].n_value, 0);
+       read(mf, s.dk_time, sizeof s.dk_time);
+       lseek(mf, (long)nl[X_DK_XFER].n_value, 0);
+       read(mf, s.dk_xfer, sizeof s.dk_xfer);
+       lseek(mf, (long)nl[X_DK_WDS].n_value, 0);
+       read(mf, s.dk_wds, sizeof s.dk_wds);
+       lseek(mf, (long)nl[X_TK_NIN].n_value, 0);
+       read(mf, &s.tk_nin, sizeof s.tk_nin);
+       lseek(mf, (long)nl[X_TK_NOUT].n_value, 0);
+       read(mf, &s.tk_nout, sizeof s.tk_nout);
+       lseek(mf, (long)nl[X_DK_SEEK].n_value, 0);
+       read(mf, s.dk_seek, sizeof s.dk_seek);
+       lseek(mf, (long)nl[X_CP_TIME].n_value, 0);
+       read(mf, s.cp_time, sizeof s.cp_time);
+       lseek(mf, (long)nl[X_DK_MSPW].n_value, 0);
+       read(mf, s.dk_mspw, sizeof s.dk_mspw);
+       for (i = 0; i < DK_NDRIVE; i++) {
+#define X(fld) t = s.fld[i]; s.fld[i] -= s1.fld[i]; s1.fld[i] = t
+               X(dk_xfer); X(dk_seek); X(dk_wds); X(dk_time);
        }
        }
-       if (aflg)
-               printf("%.2f minutes total\n", etime/3600);
-       if (sflg) {
-               stats2(etime);
-               goto contin;
+       t = s.tk_nin; s.tk_nin -= s1.tk_nin; s1.tk_nin = t;
+       t = s.tk_nout; s.tk_nout -= s1.tk_nout; s1.tk_nout = t;
+       etime = 0;
+       for(i=0; i<CPUSTATES; i++) {
+               X(cp_time);
+               etime += s.cp_time[i];
        }
        }
-       if (iflg) {
-               stats3(etime);
-               goto contin;
-       }
-       etime /= 60.;
-       if(tflg) {
-               f1 = s.tin;
-               f2 = s.tout;
-               printf("%6.1f", f1/etime);
-               printf("%6.1f", f2/etime);
-       }
-       for(i=0; i<3; i++)
-               stats(i);
-       for(i=0; i<4; i++)
-               stat1(i*8);
+       if (etime == 0.0)
+               etime = 1.0;
+       etime /= 60.0;
+       printf("%4.0f%5.0f", s.tk_nin/etime, s.tk_nout/etime);
+       for (i=0; i<DK_NDRIVE; i++)
+               if (s.dk_mspw[i] != 0.0)
+                       stats(i);
+       for (i=0; i<CPUSTATES; i++)
+               stat1(i);
        printf("\n");
 contin:
        --iter;
        printf("\n");
 contin:
        --iter;
@@ -139,133 +133,47 @@ contin:
        }
 }
 
        }
 }
 
-/* usec per word for the various disks */
-double xf[] = {
-       16.0,   /* RF */
-       11.1,   /* RK03/05 */
-       2.48,   /* RP06 */
-};
-
 stats(dn)
 {
        register i;
 stats(dn)
 {
        register i;
-       double f1, f2, f3;
-       double f4, f5, f6;
-       long t;
+       double atime, words, xtime, itime;
 
 
-       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.) {
-               printf("%6.0f%6.1f%6.1f", 0.0, 0.0, 0.0);
+       if (s.dk_mspw[dn] == 0.0) {
+               printf("%4.0f%4.0f%5.1f ", 0.0, 0.0, 0.0);
                return;
        }
                return;
        }
-       f3 = s.wds[dn];
-       f3 = f3*32.;
-       f4 = xf[dn];
-       f4 = f4*1.0e-6;
-       f5 = f1 - f4*f3;
-       f6 = f1 - f5;
-       printf("%6.0f", f2*60./etime);
-       printf("%6.1f", f5*1000./f2);
-       printf("%6.1f", f6*1000./f2);
+       atime = s.dk_time[dn];
+       atime /= 60.0;
+       words = s.dk_wds[dn]*32.0;      /* number of words transferred */
+       xtime = s.dk_mspw[dn]*words;    /* transfer time */
+       itime = atime - xtime;          /* time not transferring */
+/*
+       printf("\ndn %d, words %8.2f, atime %6.2f, xtime %6.2f, itime %6.2f\n",
+           dn, words, atime, xtime, itime);
+*/
+       if (xtime < 0)
+               itime += xtime, xtime = 0;
+       if (itime < 0)
+               xtime += itime, itime = 0;
+       printf("%4.0f", s.dk_seek[dn]/etime);
+       printf("%4.0f", s.dk_xfer[dn]/etime);
+       printf("%5.1f ",
+           s.dk_seek[dn] ? itime*1000./s.dk_seek[dn] : 0.0);
+/*
+       printf("%4.1f",
+           s.dk_xfer[dn] ? xtime*1000./s.dk_xfer[dn] : 0.0);
+*/
 }
 
 stat1(o)
 {
        register i;
 }
 
 stat1(o)
 {
        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("%6.2f", f2*100./f1);
-}
-
-stats2(t)
-double t;
-{
-       register i, j;
-
-       for (i=0; i<4; i++) {
-               for (j=0; j<8; j++)
-                       printf("%6.2f\n", s.etime[8*i+j]/(t/100));
-               printf("\n");
-       }
-}
-
-stats3(t)
-double t;
-{
-       register i;
-       double sum;
-
-       t /= 100;
-       printf("%6.2f idle\n", s.etime[24]/t);
-       sum = 0;
-       for (i=0; i<8; i++)
-               sum += s.etime[i];
-       printf("%6.2f user\n", sum/t);
-       sum = 0;
-       for (i=0; i<8; i++)
-               sum += s.etime[8+i];
-       printf("%6.2f nice\n", sum/t);
-       sum = 0;
-       for (i=0; i<8; i++)
-               sum += s.etime[16+i];
-       printf("%6.2f system\n", sum/t);
-       sum = 0;
-       for (i=1; i<8; i++)
-               sum += s.etime[24+i];
-       printf("%6.2f IO wait\n", sum/t);
-       sum = 0;
-       for (i=1; i<8; i++)
-               sum += s.etime[i]+s.etime[i+8]+s.etime[i+16]+s.etime[i+24];
-       printf("%6.2f IO active\n", sum/t);
-       sum = 0;
-       for (i=0; i<32; i++)
-               if (i&01)
-                       sum += s.etime[i];
-       printf("%6.2f RF active\n", sum/t);
-       sum = 0;
-       for (i=0; i<32; i++)
-               if (i&02)
-                       sum += s.etime[i];
-       printf("%6.2f RK active\n", sum/t);
-       sum = 0;
-       for (i=0; i<32; i++)
-               if (i&04)
-                       sum += s.etime[i];
-       printf("%6.2f RP active\n", sum/t);
-}
-
-biostats()
-{
-register i;
-
-       lseek(mf,(long)nl[1].value, 0);
-       read(mf, (char *)&io_info, sizeof(io_info));
-       printf("%D\t%D\t%D\t%D\n",
-        io_info.nread-io_delta.nread, io_info.nreada-io_delta.nreada,
-        io_info.ncache-io_delta.ncache, io_info.nwrite-io_delta.nwrite);
-
-       for(i=0; i<30; ) {
-               printf("%D\t",(long)io_info.bufcount[i]-io_delta.bufcount[i]);
-               i++;
-               if (i % 10 == 0)
-                       printf("\n");
-       }
-       io_delta = io_info;
+       double time;
+
+       time = 0;
+       for(i=0; i<CPUSTATES; i++)
+               time += s.cp_time[i];
+       if (time == 0.0)
+               time = 1.0;
+       printf("%3.0f", 100*s.cp_time[o]/time);
 }
 }