version 1.5, 1996/03/01 07:35:40 |
version 1.6, 1996/03/03 02:51:24 |
|
|
#include <string.h> |
#include <string.h> |
#include <paths.h> |
#include <paths.h> |
#include <limits.h> |
#include <limits.h> |
|
#include "dkstats.h" |
|
|
#define NEWVM /* XXX till old has been updated or purged */ |
#define NEWVM /* XXX till old has been updated or purged */ |
struct nlist namelist[] = { |
struct nlist namelist[] = { |
|
|
{ "" }, |
{ "" }, |
}; |
}; |
|
|
struct _disk { |
/* Objects defined in dkstats.c */ |
long time[CPUSTATES]; |
extern struct _disk cur; |
long *xfer; |
extern char **dr_name; |
} cur, last; |
extern int *dk_select, dk_ndrive; |
|
|
struct vmmeter sum, osum; |
struct vmmeter sum, osum; |
char **dr_name; |
int ndrives; |
int *dr_select, dk_ndrive, ndrives; |
|
|
|
int winlines = 20; |
int winlines = 20; |
|
|
|
|
#define TIMESTAT 0x10 |
#define TIMESTAT 0x10 |
#define VMSTAT 0x20 |
#define VMSTAT 0x20 |
|
|
#include "names.c" /* disk names -- machine dependent */ |
|
|
|
void cpustats(), dkstats(), dointr(), domem(), dosum(); |
void cpustats(), dkstats(), dointr(), domem(), dosum(); |
void dovmstat(), kread(), usage(); |
void dovmstat(), kread(), usage(); |
void dotimes(), doforkst(); |
void dotimes(), doforkst(); |
|
|
|
char *nlistf = NULL; |
|
char *memf = NULL; |
|
|
main(argc, argv) |
main(argc, argv) |
register int argc; |
register int argc; |
register char **argv; |
register char **argv; |
|
|
case 'c': |
case 'c': |
reps = atoi(optarg); |
reps = atoi(optarg); |
break; |
break; |
#ifndef notdef |
|
case 'f': |
case 'f': |
todo |= FORKSTAT; |
todo |= FORKSTAT; |
break; |
break; |
#endif |
|
case 'i': |
case 'i': |
todo |= INTRSTAT; |
todo |= INTRSTAT; |
break; |
break; |
|
|
} |
} |
|
|
if (todo & VMSTAT) { |
if (todo & VMSTAT) { |
char **getdrivedata(); |
char **choosedrives(); |
struct winsize winsize; |
struct winsize winsize; |
|
|
argv = getdrivedata(argv); |
dkinit(0); /* Initialize disk stats, no disks selected. */ |
|
argv = choosedrives(argv); /* Select disks. */ |
winsize.ws_row = 0; |
winsize.ws_row = 0; |
(void) ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&winsize); |
(void) ioctl(STDOUT_FILENO, TIOCGWINSZ, (char *)&winsize); |
if (winsize.ws_row > 0) |
if (winsize.ws_row > 0) |
|
|
} |
} |
|
|
char ** |
char ** |
getdrivedata(argv) |
choosedrives(argv) |
char **argv; |
char **argv; |
{ |
{ |
register int i; |
register int i; |
register char **cp; |
register char **cp; |
char buf[30]; |
char buf[30]; |
|
|
kread(X_DK_NDRIVE, &dk_ndrive, sizeof(dk_ndrive)); |
|
if (dk_ndrive <= 0) { |
|
(void)fprintf(stderr, "vmstat: dk_ndrive %d\n", dk_ndrive); |
|
exit(1); |
|
} |
|
dr_select = calloc((size_t)dk_ndrive, sizeof(int)); |
|
dr_name = calloc((size_t)dk_ndrive, sizeof(char *)); |
|
for (i = 0; i < dk_ndrive; i++) |
|
dr_name[i] = NULL; |
|
cur.xfer = calloc((size_t)dk_ndrive, sizeof(long)); |
|
last.xfer = calloc((size_t)dk_ndrive, sizeof(long)); |
|
if (!read_names()) |
|
exit (1); |
|
for (i = 0; i < dk_ndrive; i++) |
|
if (dr_name[i] == NULL) { |
|
(void)sprintf(buf, "??%d", i); |
|
dr_name[i] = strdup(buf); |
|
} |
|
|
|
/* |
/* |
* Choose drives to be displayed. Priority goes to (in order) drives |
* Choose drives to be displayed. Priority goes to (in order) drives |
* supplied as arguments, default drives. If everything isn't filled |
* supplied as arguments, default drives. If everything isn't filled |
|
|
for (i = 0; i < dk_ndrive; i++) { |
for (i = 0; i < dk_ndrive; i++) { |
if (strcmp(dr_name[i], *argv)) |
if (strcmp(dr_name[i], *argv)) |
continue; |
continue; |
dr_select[i] = 1; |
dk_select[i] = 1; |
++ndrives; |
++ndrives; |
break; |
break; |
} |
} |
} |
} |
for (i = 0; i < dk_ndrive && ndrives < 4; i++) { |
for (i = 0; i < dk_ndrive && ndrives < 4; i++) { |
if (dr_select[i]) |
if (dk_select[i]) |
continue; |
continue; |
for (cp = defdrives; *cp; cp++) |
dk_select[i] = 1; |
if (strcmp(dr_name[i], *cp) == 0) { |
|
dr_select[i] = 1; |
|
++ndrives; |
|
break; |
|
} |
|
} |
|
for (i = 0; i < dk_ndrive && ndrives < 4; i++) { |
|
if (dr_select[i]) |
|
continue; |
|
dr_select[i] = 1; |
|
++ndrives; |
++ndrives; |
} |
} |
return(argv); |
return(argv); |
|
|
for (hdrcnt = 1;;) { |
for (hdrcnt = 1;;) { |
if (!--hdrcnt) |
if (!--hdrcnt) |
printhdr(); |
printhdr(); |
kread(X_CPTIME, cur.time, sizeof(cur.time)); |
/* Read new disk statistics */ |
kread(X_DKXFER, cur.xfer, sizeof(*cur.xfer) * dk_ndrive); |
dkreadstats(); |
kread(X_SUM, &sum, sizeof(sum)); |
kread(X_SUM, &sum, sizeof(sum)); |
size = sizeof(total); |
size = sizeof(total); |
mib[0] = CTL_VM; |
mib[0] = CTL_VM; |
|
|
} |
} |
(void)printf("%2d%2d%2d", |
(void)printf("%2d%2d%2d", |
total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw); |
total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw); |
#define pgtok(a) ((a) * sum.v_page_size >> 10) |
#define pgtok(a) ((a) * (sum.v_page_size >> 10)) |
#define rate(x) (((x) + halfuptime) / uptime) /* round */ |
#define rate(x) (((x) + halfuptime) / uptime) /* round */ |
(void)printf("%6ld%6ld ", |
(void)printf("%6ld%6ld ", |
pgtok(total.t_avm), pgtok(total.t_free)); |
pgtok(total.t_avm), pgtok(total.t_free)); |
|
|
register int i; |
register int i; |
|
|
(void)printf(" procs memory page%*s", 20, ""); |
(void)printf(" procs memory page%*s", 20, ""); |
if (ndrives > 1) |
if (ndrives > 0) |
(void)printf("disks %*s faults cpu\n", |
#ifdef NEWVM |
ndrives * 3 - 6, ""); |
(void)printf("%s %*sfaults cpu\n", |
|
((ndrives > 1) ? "disks" : "disk"), |
|
#else |
|
(void)printf("disks %*sfaults cpu\n", |
|
#endif |
|
((ndrives > 1) ? ndrives * 3 - 4 : 0), ""); |
else |
else |
(void)printf("%*s faults cpu\n", ndrives * 3, ""); |
#ifdef NEWVM |
#ifndef NEWVM |
(void)printf("%*s faults cpu\n", |
(void)printf(" r b w avm fre re at pi po fr de sr "); |
|
#else |
#else |
|
(void)printf("%*s faults cpu\n", |
|
#endif |
|
ndrives * 3, ""); |
|
|
|
#ifdef NEWVM |
(void)printf(" r b w avm fre flt re pi po fr sr "); |
(void)printf(" r b w avm fre flt re pi po fr sr "); |
|
#else |
|
(void)printf(" r b w avm fre re at pi po fr de sr "); |
#endif |
#endif |
for (i = 0; i < dk_ndrive; i++) |
for (i = 0; i < dk_ndrive; i++) |
if (dr_select[i]) |
if (dk_select[i]) |
(void)printf("%c%c ", dr_name[i][0], |
(void)printf("%c%c ", dr_name[i][0], |
dr_name[i][strlen(dr_name[i]) - 1]); |
dr_name[i][strlen(dr_name[i]) - 1]); |
(void)printf(" in sy cs us sy id\n"); |
(void)printf(" in sy cs us sy id\n"); |
|
|
double etime; |
double etime; |
long tmp; |
long tmp; |
|
|
for (dn = 0; dn < dk_ndrive; ++dn) { |
/* Calculate disk stat deltas. */ |
tmp = cur.xfer[dn]; |
dkswap(); |
cur.xfer[dn] -= last.xfer[dn]; |
|
last.xfer[dn] = tmp; |
|
} |
|
etime = 0; |
etime = 0; |
for (state = 0; state < CPUSTATES; ++state) { |
for (state = 0; state < CPUSTATES; ++state) { |
tmp = cur.time[state]; |
etime += cur.cp_time[state]; |
cur.time[state] -= last.time[state]; |
|
last.time[state] = tmp; |
|
etime += cur.time[state]; |
|
} |
} |
if (etime == 0) |
if (etime == 0) |
etime = 1; |
etime = 1; |
etime /= hz; |
etime /= hz; |
for (dn = 0; dn < dk_ndrive; ++dn) { |
for (dn = 0; dn < dk_ndrive; ++dn) { |
if (!dr_select[dn]) |
if (!dk_select[dn]) |
continue; |
continue; |
(void)printf("%2.0f ", cur.xfer[dn] / etime); |
(void)printf("%2.0f ", cur.dk_xfer[dn] / etime); |
} |
} |
} |
} |
|
|
|
|
|
|
total = 0; |
total = 0; |
for (state = 0; state < CPUSTATES; ++state) |
for (state = 0; state < CPUSTATES; ++state) |
total += cur.time[state]; |
total += cur.cp_time[state]; |
if (total) |
if (total) |
pct = 100 / total; |
pct = 100 / total; |
else |
else |
pct = 0; |
pct = 0; |
(void)printf("%2.0f ", (cur.time[CP_USER] + cur.time[CP_NICE]) * pct); |
(void)printf("%2.0f ", (cur.cp_time[CP_USER] + cur.cp_time[CP_NICE]) * pct); |
(void)printf("%2.0f ", (cur.time[CP_SYS] + cur.time[CP_INTR]) * pct); |
(void)printf("%2.0f ", (cur.cp_time[CP_SYS] + cur.cp_time[CP_INTR]) * pct); |
(void)printf("%2.0f", cur.time[CP_IDLE] * pct); |
(void)printf("%2.0f", cur.cp_time[CP_IDLE] * pct); |
} |
} |
|
|
#if defined(pc532) |
#if defined(pc532) |