📄 vmstat.c
字号:
(void)printf("%3lu ", rate(pgtok(sum.v_pgpgin - osum.v_pgpgin))); (void)printf("%3lu %3lu ", rate(pgtok(sum.v_pgpgout - osum.v_pgpgout)), rate(pgtok(sum.v_dfree - osum.v_dfree))); (void)printf("%3d ", pgtok(deficit));#endif (void)printf("%3lu ", rate(sum.v_scan - osum.v_scan)); dkstats(); (void)printf("%4lu %4lu %3lu ", rate(sum.v_intr - osum.v_intr), rate(sum.v_syscall - osum.v_syscall), rate(sum.v_swtch - osum.v_swtch)); cpustats(); (void)printf("\n"); (void)fflush(stdout); if (reps >= 0 && --reps <= 0) break; osum = sum; uptime = interval; /* * We round upward to avoid losing low-frequency events * (i.e., >= 1 per interval but < 1 per second). */ halfuptime = (uptime + 1) / 2; (void)sleep(interval); }}printhdr(){ register int i; (void)printf(" procs memory page%*s", 20, ""); if (ndrives > 1) (void)printf("disks %*s faults cpu\n", ndrives * 3 - 6, ""); else (void)printf("%*s faults cpu\n", ndrives * 3, "");#ifndef NEWVM (void)printf(" r b w avm fre re at pi po fr de sr ");#else (void)printf(" r b w avm fre flt re pi po fr sr ");#endif for (i = 0; i < dk_ndrive; i++) if (dr_select[i]) (void)printf("%c%c ", dr_name[i][0], dr_name[i][strlen(dr_name[i]) - 1]); (void)printf(" in sy cs us sy id\n"); hdrcnt = winlines - 2;}/* * Force a header to be prepended to the next output. */voidneedhdr(){ hdrcnt = 1;}#ifdef notdefvoiddotimes(){ u_int pgintime, rectime; kread(X_REC, &rectime, sizeof(rectime)); kread(X_PGIN, &pgintime, sizeof(pgintime)); kread(X_SUM, &sum, sizeof(sum)); (void)printf("%u reclaims, %u total time (usec)\n", sum.v_pgrec, rectime); (void)printf("average: %u usec / reclaim\n", rectime / sum.v_pgrec); (void)printf("\n"); (void)printf("%u page ins, %u total time (msec)\n", sum.v_pgin, pgintime / 10); (void)printf("average: %8.1f msec / page in\n", pgintime / (sum.v_pgin * 10.0));}#endifpct(top, bot) long top, bot;{ long ans; if (bot == 0) return(0); ans = (quad_t)top * 100 / bot; return (ans);}#define PCT(top, bot) pct((long)(top), (long)(bot))#if defined(tahoe)#include <machine/cpu.h>#endifvoiddosum(){ struct nchstats nchstats;#ifndef NEWVM struct xstats xstats;#endif long nchtotal;#if defined(tahoe) struct keystats keystats;#endif kread(X_SUM, &sum, sizeof(sum)); (void)printf("%9u cpu context switches\n", sum.v_swtch); (void)printf("%9u device interrupts\n", sum.v_intr); (void)printf("%9u software interrupts\n", sum.v_soft);#ifdef vax (void)printf("%9u pseudo-dma dz interrupts\n", sum.v_pdma);#endif (void)printf("%9u traps\n", sum.v_trap); (void)printf("%9u system calls\n", sum.v_syscall); (void)printf("%9u total faults taken\n", sum.v_faults); (void)printf("%9u swap ins\n", sum.v_swpin); (void)printf("%9u swap outs\n", sum.v_swpout); (void)printf("%9u pages swapped in\n", sum.v_pswpin / CLSIZE); (void)printf("%9u pages swapped out\n", sum.v_pswpout / CLSIZE); (void)printf("%9u page ins\n", sum.v_pageins); (void)printf("%9u page outs\n", sum.v_pageouts); (void)printf("%9u pages paged in\n", sum.v_pgpgin); (void)printf("%9u pages paged out\n", sum.v_pgpgout); (void)printf("%9u pages reactivated\n", sum.v_reactivated); (void)printf("%9u intransit blocking page faults\n", sum.v_intrans); (void)printf("%9u zero fill pages created\n", sum.v_nzfod / CLSIZE); (void)printf("%9u zero fill page faults\n", sum.v_zfod / CLSIZE); (void)printf("%9u pages examined by the clock daemon\n", sum.v_scan); (void)printf("%9u revolutions of the clock hand\n", sum.v_rev);#ifdef NEWVM (void)printf("%9u VM object cache lookups\n", sum.v_lookups); (void)printf("%9u VM object hits\n", sum.v_hits); (void)printf("%9u total VM faults taken\n", sum.v_vm_faults); (void)printf("%9u copy-on-write faults\n", sum.v_cow_faults); (void)printf("%9u pages freed by daemon\n", sum.v_dfree); (void)printf("%9u pages freed by exiting processes\n", sum.v_pfree); (void)printf("%9u pages free\n", sum.v_free_count); (void)printf("%9u pages wired down\n", sum.v_wire_count); (void)printf("%9u pages active\n", sum.v_active_count); (void)printf("%9u pages inactive\n", sum.v_inactive_count); (void)printf("%9u bytes per page\n", sum.v_page_size);#else (void)printf("%9u sequential process pages freed\n", sum.v_seqfree); (void)printf("%9u total reclaims (%d%% fast)\n", sum.v_pgrec, PCT(sum.v_fastpgrec, sum.v_pgrec)); (void)printf("%9u reclaims from free list\n", sum.v_pgfrec); (void)printf("%9u executable fill pages created\n", sum.v_nexfod / CLSIZE); (void)printf("%9u executable fill page faults\n", sum.v_exfod / CLSIZE); (void)printf("%9u swap text pages found in free list\n", sum.v_xsfrec); (void)printf("%9u inode text pages found in free list\n", sum.v_xifrec); (void)printf("%9u file fill pages created\n", sum.v_nvrfod / CLSIZE); (void)printf("%9u file fill page faults\n", sum.v_vrfod / CLSIZE); (void)printf("%9u pages freed by the clock daemon\n", sum.v_dfree / CLSIZE);#endif kread(X_NCHSTATS, &nchstats, sizeof(nchstats)); nchtotal = nchstats.ncs_goodhits + nchstats.ncs_neghits + nchstats.ncs_badhits + nchstats.ncs_falsehits + nchstats.ncs_miss + nchstats.ncs_long; (void)printf("%9ld total name lookups\n", nchtotal); (void)printf( "%9s cache hits (%d%% pos + %d%% neg) system %d%% per-process\n", "", PCT(nchstats.ncs_goodhits, nchtotal), PCT(nchstats.ncs_neghits, nchtotal), PCT(nchstats.ncs_pass2, nchtotal)); (void)printf("%9s deletions %d%%, falsehits %d%%, toolong %d%%\n", "", PCT(nchstats.ncs_badhits, nchtotal), PCT(nchstats.ncs_falsehits, nchtotal), PCT(nchstats.ncs_long, nchtotal));#ifndef NEWVM kread(X_XSTATS, &xstats, sizeof(xstats)); (void)printf("%9lu total calls to xalloc (cache hits %d%%)\n", xstats.alloc, PCT(xstats.alloc_cachehit, xstats.alloc)); (void)printf("%9s sticky %lu flushed %lu unused %lu\n", "", xstats.alloc_inuse, xstats.alloc_cacheflush, xstats.alloc_unused); (void)printf("%9lu total calls to xfree", xstats.free); (void)printf(" (sticky %lu cached %lu swapped %lu)\n", xstats.free_inuse, xstats.free_cache, xstats.free_cacheswap);#endif#if defined(tahoe) kread(X_CKEYSTATS, &keystats, sizeof(keystats)); (void)printf("%9d %s (free %d%% norefs %d%% taken %d%% shared %d%%)\n", keystats.ks_allocs, "code cache keys allocated", PCT(keystats.ks_allocfree, keystats.ks_allocs), PCT(keystats.ks_norefs, keystats.ks_allocs), PCT(keystats.ks_taken, keystats.ks_allocs), PCT(keystats.ks_shared, keystats.ks_allocs)); kread(X_DKEYSTATS, &keystats, sizeof(keystats)); (void)printf("%9d %s (free %d%% norefs %d%% taken %d%% shared %d%%)\n", keystats.ks_allocs, "data cache keys allocated", PCT(keystats.ks_allocfree, keystats.ks_allocs), PCT(keystats.ks_norefs, keystats.ks_allocs), PCT(keystats.ks_taken, keystats.ks_allocs), PCT(keystats.ks_shared, keystats.ks_allocs));#endif}#ifdef notdefvoiddoforkst(){ struct forkstat fks; kread(X_FORKSTAT, &fks, sizeof(struct forkstat)); (void)printf("%d forks, %d pages, average %.2f\n", fks.cntfork, fks.sizfork, (double)fks.sizfork / fks.cntfork); (void)printf("%d vforks, %d pages, average %.2f\n", fks.cntvfork, fks.sizvfork, (double)fks.sizvfork / fks.cntvfork);}#endifvoiddkstats(){ register int dn, state; double etime; long tmp; for (dn = 0; dn < dk_ndrive; ++dn) { tmp = cur.xfer[dn]; cur.xfer[dn] -= last.xfer[dn]; last.xfer[dn] = tmp; } etime = 0; for (state = 0; state < CPUSTATES; ++state) { tmp = cur.time[state]; cur.time[state] -= last.time[state]; last.time[state] = tmp; etime += cur.time[state]; } if (etime == 0) etime = 1; etime /= hz; for (dn = 0; dn < dk_ndrive; ++dn) { if (!dr_select[dn]) continue; (void)printf("%2.0f ", cur.xfer[dn] / etime); }}voidcpustats(){ register int state; double pct, total; total = 0; for (state = 0; state < CPUSTATES; ++state) total += cur.time[state]; if (total) pct = 100 / total; else pct = 0; (void)printf("%2.0f ", (cur.time[CP_USER] + cur.time[CP_NICE]) * pct); (void)printf("%2.0f ", (cur.time[CP_SYS] + cur.time[CP_INTR]) * pct); (void)printf("%2.0f", cur.time[CP_IDLE] * pct);}voiddointr(){ register long *intrcnt, inttotal, uptime; register int nintr, inamlen; register char *intrname; uptime = getuptime(); nintr = namelist[X_EINTRCNT].n_value - namelist[X_INTRCNT].n_value; inamlen = namelist[X_EINTRNAMES].n_value - namelist[X_INTRNAMES].n_value; intrcnt = malloc((size_t)nintr); intrname = malloc((size_t)inamlen); if (intrcnt == NULL || intrname == NULL) { (void)fprintf(stderr, "vmstat: %s.\n", strerror(errno)); exit(1); } kread(X_INTRCNT, intrcnt, (size_t)nintr); kread(X_INTRNAMES, intrname, (size_t)inamlen); (void)printf("interrupt total rate\n"); inttotal = 0; nintr /= sizeof(long); while (--nintr >= 0) { if (*intrcnt) (void)printf("%-12s %8ld %8ld\n", intrname, *intrcnt, *intrcnt / uptime); intrname += strlen(intrname) + 1; inttotal += *intrcnt++; } (void)printf("Total %8ld %8ld\n", inttotal, inttotal / uptime);}/* * These names are defined in <sys/malloc.h>. */char *kmemnames[] = INITKMEMNAMES;voiddomem(){ register struct kmembuckets *kp; register struct kmemstats *ks; register int i, j; int len, size, first; long totuse = 0, totfree = 0, totreq = 0; char *name; struct kmemstats kmemstats[M_LAST]; struct kmembuckets buckets[MINBUCKET + 16]; kread(X_KMEMBUCKETS, buckets, sizeof(buckets)); (void)printf("Memory statistics by bucket size\n"); (void)printf( " Size In Use Free Requests HighWater Couldfree\n"); for (i = MINBUCKET, kp = &buckets[i]; i < MINBUCKET + 16; i++, kp++) { if (kp->kb_calls == 0) continue; size = 1 << i; (void)printf("%8d %8ld %6ld %10ld %7ld %10ld\n", size, kp->kb_total - kp->kb_totalfree, kp->kb_totalfree, kp->kb_calls, kp->kb_highwat, kp->kb_couldfree); totfree += size * kp->kb_totalfree; } kread(X_KMEMSTAT, kmemstats, sizeof(kmemstats)); (void)printf("\nMemory usage type by bucket size\n"); (void)printf(" Size Type(s)\n"); kp = &buckets[MINBUCKET]; for (j = 1 << MINBUCKET; j < 1 << (MINBUCKET + 16); j <<= 1, kp++) { if (kp->kb_calls == 0) continue; first = 1; len = 8; for (i = 0, ks = &kmemstats[0]; i < M_LAST; i++, ks++) { if (ks->ks_calls == 0) continue; if ((ks->ks_size & j) == 0) continue; name = kmemnames[i] ? kmemnames[i] : "undefined"; len += 2 + strlen(name); if (first) printf("%8d %s", j, name); else printf(","); if (len >= 80) { printf("\n\t "); len = 10 + strlen(name); } if (!first) printf(" %s", name); first = 0; } printf("\n"); } (void)printf( "\nMemory statistics by type Type Kern\n"); (void)printf(" Type InUse MemUse HighUse Limit Requests Limit Limit Size(s)\n"); for (i = 0, ks = &kmemstats[0]; i < M_LAST; i++, ks++) { if (ks->ks_calls == 0) continue; (void)printf("%11s%6ld%6ldK%7ldK%6ldK%9ld%5u%6u", kmemnames[i] ? kmemnames[i] : "undefined", ks->ks_inuse, (ks->ks_memuse + 1023) / 1024, (ks->ks_maxused + 1023) / 1024, (ks->ks_limit + 1023) / 1024, ks->ks_calls, ks->ks_limblocks, ks->ks_mapblocks); first = 1; for (j = 1 << MINBUCKET; j < 1 << (MINBUCKET + 16); j <<= 1) { if ((ks->ks_size & j) == 0) continue; if (first) printf(" %d", j); else printf(",%d", j); first = 0; } printf("\n"); totuse += ks->ks_memuse; totreq += ks->ks_calls; } (void)printf("\nMemory Totals: In Use Free Requests\n"); (void)printf(" %7ldK %6ldK %8ld\n", (totuse + 1023) / 1024, (totfree + 1023) / 1024, totreq);}/* * kread reads something from the kernel, given its nlist index. */voidkread(nlx, addr, size) int nlx; void *addr; size_t size;{ char *sym; if (namelist[nlx].n_type == 0 || namelist[nlx].n_value == 0) { sym = namelist[nlx].n_name; if (*sym == '_') ++sym; (void)fprintf(stderr, "vmstat: symbol %s not defined\n", sym); exit(1); } if (kvm_read(kd, namelist[nlx].n_value, addr, size) != size) { sym = namelist[nlx].n_name; if (*sym == '_') ++sym; (void)fprintf(stderr, "vmstat: %s: %s\n", sym, kvm_geterr(kd)); exit(1); }}voidusage(){ (void)fprintf(stderr,#ifndef NEWVM "usage: vmstat [-fimst] [-c count] [-M core] \[-N system] [-w wait] [disks]\n");#else "usage: vmstat [-ims] [-c count] [-M core] \[-N system] [-w wait] [disks]\n");#endif exit(1);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -