-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
{
- 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;
-struct iostat {
- int nbuf;
- long nread;
- long nreada;
- long ncache;
- long nwrite;
- long bufcount[50];
-} io_info, io_delta;
-double etime;
-
int mf;
+double etime;
main(argc, argv)
char *argv[];
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);
}
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++;
}
+ 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 (!(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:
- 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;
}
}
-/* usec per word for the various disks */
-double xf[] = {
- 16.0, /* RF */
- 11.1, /* RK03/05 */
- 2.48, /* RP06 */
-};
-
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;
}
- 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;
- 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);
}