version 1.37, 2000/06/27 18:11:48 |
version 1.38, 2000/10/25 16:49:32 |
|
|
/* Namelist and memory file names. */ |
/* Namelist and memory file names. */ |
char *nlistf, *memf; |
char *nlistf, *memf; |
|
|
|
extern char *__progname; |
|
|
int |
int |
main(argc, argv) |
main(argc, argv) |
register int argc; |
register int argc; |
|
|
} |
} |
|
|
kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); |
kd = kvm_openfiles(nlistf, memf, NULL, O_RDONLY, errbuf); |
if (kd == 0) { |
if (kd == 0) |
(void)fprintf(stderr, |
errx(1, "kvm_openfiles: %s", errbuf); |
"vmstat: kvm_openfiles: %s\n", errbuf); |
|
exit(1); |
|
} |
|
|
|
if ((c = kvm_nlist(kd, namelist)) != 0) { |
if ((c = kvm_nlist(kd, namelist)) != 0) { |
|
|
|
|
|
|
if (c > 0) { |
if (c > 0) { |
(void)fprintf(stderr, |
(void)fprintf(stderr, |
"vmstat: undefined symbols:"); |
"%s: undefined symbols:", __progname); |
for (c = 0; |
for (c = 0; |
c < sizeof(namelist)/sizeof(namelist[0]); c++) |
c < sizeof(namelist)/sizeof(namelist[0]); c++) |
if (namelist[c].n_type == 0) |
if (namelist[c].n_type == 0) |
fprintf(stderr, " %s", |
fprintf(stderr, " %s", |
namelist[c].n_name); |
namelist[c].n_name); |
(void)fputc('\n', stderr); |
(void)fputc('\n', stderr); |
|
exit(1); |
} else |
} else |
(void)fprintf(stderr, "vmstat: kvm_nlist: %s\n", |
errx(1, "kvm_nlist: %s", kvm_geterr(kd)); |
kvm_geterr(kd)); |
|
exit(1); |
|
} |
} |
|
|
if (todo & VMSTAT) { |
if (todo & VMSTAT) { |
|
|
kread(X_BOOTTIME, &boottime, sizeof(boottime)); |
kread(X_BOOTTIME, &boottime, sizeof(boottime)); |
(void)time(&now); |
(void)time(&now); |
uptime = now - boottime.tv_sec; |
uptime = now - boottime.tv_sec; |
if (uptime <= 0 || uptime > 60*60*24*365*10) { |
if (uptime <= 0 || uptime > 60*60*24*365*10) |
(void)fprintf(stderr, |
errx(1, "time makes no sense; namelist must be wrong"); |
"vmstat: time makes no sense; namelist must be wrong.\n"); |
|
exit(1); |
|
} |
|
return(uptime); |
return(uptime); |
} |
} |
|
|
|
|
(void)printf("%11u pages being paged out\n", uvmexp.paging); |
(void)printf("%11u pages being paged out\n", uvmexp.paging); |
(void)printf("%11u pages wired\n", uvmexp.wired); |
(void)printf("%11u pages wired\n", uvmexp.wired); |
(void)printf("%11u pages reserved for pagedaemon\n", |
(void)printf("%11u pages reserved for pagedaemon\n", |
uvmexp.reserve_pagedaemon); |
uvmexp.reserve_pagedaemon); |
(void)printf("%11u pages reserved for kernel\n", |
(void)printf("%11u pages reserved for kernel\n", |
uvmexp.reserve_kernel); |
uvmexp.reserve_kernel); |
|
|
/* swap */ |
/* swap */ |
(void)printf("%11u swap pages\n", uvmexp.swpages); |
(void)printf("%11u swap pages\n", uvmexp.swpages); |
|
|
(void)printf("%11u swap outs\n", uvmexp.swapouts); |
(void)printf("%11u swap outs\n", uvmexp.swapouts); |
(void)printf("%11u forks\n", uvmexp.forks); |
(void)printf("%11u forks\n", uvmexp.forks); |
(void)printf("%11u forks where vmspace is shared\n", |
(void)printf("%11u forks where vmspace is shared\n", |
uvmexp.forks_sharevm); |
uvmexp.forks_sharevm); |
|
|
/* daemon counters */ |
/* daemon counters */ |
(void)printf("%11u number of times the pagedeamon woke up\n", |
(void)printf("%11u number of times the pagedeamon woke up\n", |
uvmexp.pdwoke); |
uvmexp.pdwoke); |
(void)printf("%11u revolutions of the clock hand\n", uvmexp.pdrevs); |
(void)printf("%11u revolutions of the clock hand\n", uvmexp.pdrevs); |
(void)printf("%11u pages freed by pagedaemon\n", uvmexp.pdfreed); |
(void)printf("%11u pages freed by pagedaemon\n", uvmexp.pdfreed); |
(void)printf("%11u pages scanned by pagedaemon\n", uvmexp.pdscans); |
(void)printf("%11u pages scanned by pagedaemon\n", uvmexp.pdscans); |
|
|
for (j = 0; j < 16; j++, ivp++) { |
for (j = 0; j < 16; j++, ivp++) { |
if (ivp->iv_vec && ivp->iv_use && ivp->iv_cnt) { |
if (ivp->iv_vec && ivp->iv_use && ivp->iv_cnt) { |
if (kvm_read(kd, (u_long)ivp->iv_use, iname, 63) != 63) { |
if (kvm_read(kd, (u_long)ivp->iv_use, iname, 63) != 63) { |
(void)fprintf(stderr, "vmstat: iv_use: %s\n", |
errx(1, "iv_use: %s", kvm_geterr(kd)); |
kvm_geterr(kd)); |
kvm_geterr(kd)); |
exit(1); |
exit(1); |
} |
} |
|
|
dointr() |
dointr() |
{ |
{ |
struct intrhand *intrhand[16], *ihp, ih; |
struct intrhand *intrhand[16], *ihp, ih; |
long inttotal; |
u_long inttotal; |
time_t uptime; |
time_t uptime; |
int intrstray[16]; |
u_long intrstray[16]; |
char iname[17], fname[31]; |
char iname[17], fname[31]; |
int i; |
int i; |
|
|
|
|
if (kvm_read(kd, (u_long)ih.ih_what, iname, 16) != 16) |
if (kvm_read(kd, (u_long)ih.ih_what, iname, 16) != 16) |
errx(1, "vmstat: ih_what: %s", kvm_geterr(kd)); |
errx(1, "vmstat: ih_what: %s", kvm_geterr(kd)); |
snprintf(fname, sizeof fname, "irq%d/%s", i, iname); |
snprintf(fname, sizeof fname, "irq%d/%s", i, iname); |
printf("%-16.16s %10ld %8ld\n", fname, ih.ih_count, |
printf("%-16.16s %10lu %8lu\n", fname, ih.ih_count, |
ih.ih_count / uptime); |
ih.ih_count / uptime); |
inttotal += ih.ih_count; |
inttotal += ih.ih_count; |
ihp = ih.ih_next; |
ihp = ih.ih_next; |
|
|
} |
} |
for (i = 0; i < 16; i++) |
for (i = 0; i < 16; i++) |
if (intrstray[i]) { |
if (intrstray[i]) { |
printf("Stray irq %-2d %10d %8d\n", |
printf("Stray irq %-2d %10lu %8lu\n", |
i, intrstray[i], intrstray[i] / uptime); |
i, intrstray[i], intrstray[i] / uptime); |
inttotal += intrstray[i]; |
inttotal += intrstray[i]; |
} |
} |
printf("Total %10ld %8ld\n", inttotal, inttotal / uptime); |
printf("Total %10lu %8lu\n", inttotal, inttotal / uptime); |
} |
} |
#else |
#else |
void |
void |
|
|
namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; |
namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; |
intrcnt = malloc((size_t)nintr); |
intrcnt = malloc((size_t)nintr); |
intrname = malloc((size_t)inamlen); |
intrname = malloc((size_t)inamlen); |
if (intrcnt == NULL || intrname == NULL) { |
if (intrcnt == NULL || intrname == NULL) |
(void)fprintf(stderr, "vmstat: %s.\n", strerror(errno)); |
err(1, "malloc"); |
exit(1); |
|
} |
|
kread(X_INTRCNT, intrcnt, (size_t)nintr); |
kread(X_INTRCNT, intrcnt, (size_t)nintr); |
kread(X_INTRNAMES, intrname, (size_t)inamlen); |
kread(X_INTRNAMES, intrname, (size_t)inamlen); |
(void)printf("interrupt total rate\n"); |
(void)printf("interrupt total rate\n"); |
|
|
evptr = allevents.tqh_first; |
evptr = allevents.tqh_first; |
while (evptr) { |
while (evptr) { |
if (kvm_read(kd, (long)evptr, (void *)&evcnt, |
if (kvm_read(kd, (long)evptr, (void *)&evcnt, |
sizeof evcnt) != sizeof evcnt) { |
sizeof evcnt) != sizeof evcnt) |
(void)fprintf(stderr, "vmstat: event chain trashed: %s\n", |
errx(1, "event chain trashed: %s", kvm_geterr(kd)); |
kvm_geterr(kd)); |
|
exit(1); |
|
} |
|
if (strcmp(evcnt.ev_name, "intr") == 0) { |
if (strcmp(evcnt.ev_name, "intr") == 0) { |
if (kvm_read(kd, (long)evcnt.ev_dev, (void *)&dev, |
if (kvm_read(kd, (long)evcnt.ev_dev, (void *)&dev, |
sizeof dev) != sizeof dev) { |
sizeof dev) != sizeof dev) |
(void)fprintf(stderr, "vmstat: event chain trashed: %s\n", |
errx(1, "event chain trashed: %s", kvm_geterr(kd)); |
kvm_geterr(kd)); |
|
exit(1); |
|
} |
|
if (evcnt.ev_count) |
if (evcnt.ev_count) |
(void)printf("%-14s %12d %8ld\n", dev.dv_xname, |
(void)printf("%-14s %12d %8ld\n", dev.dv_xname, |
evcnt.ev_count, (long)(evcnt.ev_count / uptime)); |
evcnt.ev_count, (long)(evcnt.ev_count / uptime)); |
|
|
if (first) { |
if (first) { |
(void)printf("Memory statistics by bucket size\n"); |
(void)printf("Memory statistics by bucket size\n"); |
(void)printf( |
(void)printf( |
" Size In Use Free Requests HighWater Couldfree\n"); |
" Size In Use Free Requests HighWater Couldfree\n"); |
first = 0; |
first = 0; |
} |
} |
size = 1 << i; |
size = 1 << i; |
(void)printf("%8d %8ld %6ld %10ld %7ld %10ld\n", size, |
(void)printf("%8d %8ld %6ld %10ld %7ld %10ld\n", size, |
kp->kb_total - kp->kb_totalfree, |
kp->kb_total - kp->kb_totalfree, |
kp->kb_totalfree, kp->kb_calls, |
kp->kb_totalfree, kp->kb_calls, |
kp->kb_highwat, kp->kb_couldfree); |
kp->kb_highwat, kp->kb_couldfree); |
|
|
sym = namelist[nlx].n_name; |
sym = namelist[nlx].n_name; |
if (*sym == '_') |
if (*sym == '_') |
++sym; |
++sym; |
(void)fprintf(stderr, |
errx(1, "symbol %s not defined", sym); |
"vmstat: symbol %s not defined\n", sym); |
|
exit(1); |
|
} |
} |
if (kvm_read(kd, namelist[nlx].n_value, addr, size) != size) { |
if (kvm_read(kd, namelist[nlx].n_value, addr, size) != size) { |
sym = namelist[nlx].n_name; |
sym = namelist[nlx].n_name; |
if (*sym == '_') |
if (*sym == '_') |
++sym; |
++sym; |
(void)fprintf(stderr, "vmstat: %s: %s\n", sym, kvm_geterr(kd)); |
errx(1, "%s: %s", sym, kvm_geterr(kd)); |
exit(1); |
|
} |
} |
} |
} |
|
|
void |
void |
usage() |
usage() |
{ |
{ |
(void)fprintf(stderr, |
(void)fprintf(stderr, "usage: %s [-fimst] [-c count] [-M core] " |
"usage: vmstat [-fimst] [-c count] [-M core] \ |
"[-N system] [-w wait] [disks]\n", __progname); |
[-N system] [-w wait] [disks]\n"); |
|
exit(1); |
exit(1); |
} |
} |
|
|