V7/usr/src/cmd/iostat.c
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
};
struct
{
int busy;
long etime[32];
long numb[3];
long wds[3];
long tin;
long tout;
} 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;
main(argc, argv)
char *argv[];
{
extern char *ctime();
register i;
int iter;
double f1, f2;
long t;
nlist("/unix", nl);
if(nl[0].type == -1) {
printf("dk_busy not found in /unix namelist\n");
exit(1);
}
mf = open("/dev/kmem", 0);
if(mf < 0) {
printf("cannot open /dev/kmem\n");
exit(1);
}
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++;
}
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 (dflg) {
long tm;
time(&tm);
printf("%s", ctime(&tm));
}
if (aflg)
printf("%.2f minutes total\n", etime/3600);
if (sflg) {
stats2(etime);
goto contin;
}
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);
printf("\n");
contin:
--iter;
if(iter)
if(argc > 1) {
sleep(atoi(argv[1]));
goto loop;
}
}
/* 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;
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);
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);
}
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;
}