void ssize(const struct kinfo_proc *kp, VARENT *ve) { VAR *v; v = ve->var; (void)printf("%*llu", v->width, pgtok(kp->p_vm_ssize)); }
void p_rssize(const struct kinfo_proc *kp, VARENT *ve) { VAR *v; v = ve->var; (void)printf("%*llu", v->width, (kp->p_flag & P_SYSTEM) ? 0 : pgtok(kp->p_vm_rssize)); }
void vsize(const struct kinfo_proc2 *kp, VARENT *ve) { VAR *v; v = ve->var; (void)printf("%*d", v->width, pgtok(kp->p_vm_dsize + kp->p_vm_ssize + kp->p_vm_tsize)); }
void rssize(const struct kinfo_proc *kp, VARENT *ve) { VAR *v; v = ve->var; /* XXX don't have info about shared */ (void)printf("%*llu", v->width, (kp->p_flag & P_SYSTEM) ? 0 : pgtok(kp->p_vm_rssize)); }
int main(int argc, char *argv[]) { int mib[2],i=0,len; int pagesize, pagesize_len; struct vmtotal v; if (argc > 1 && !strcmp(argv[1], "-i")) { if (vm_i()) fprintf(stderr, "vm -i stats not available via sysctl\n"); return 0 ; } pagesize_len = sizeof(int); sysctlbyname("vm.stats.vm.v_page_size",&pagesize,&pagesize_len,NULL,0); len=sizeof(struct vmtotal); mib[0]=CTL_VM; mib[1]=VM_METER; for(;;) { sysctl(mib,2,&v,&len,NULL,0); if(i==0) { printf(" procs kB virt mem real mem shared vm shared real free\n"); printf(" r w l s tot act tot act tot act tot act\n"); } printf("%2hd%2hd%2hd%2hd",v.t_rq-1,v.t_dw+v.t_pw,v.t_sl,v.t_sw); printf("%7d %7d %7d%7d", pgtok(v.t_vm),pgtok(v.t_avm), pgtok(v.t_rm),pgtok(v.t_arm)); printf("%7d%7d%7d%7d%7d\n", pgtok(v.t_vmshr),pgtok(v.t_avmshr), pgtok(v.t_rmshr),pgtok(v.t_armshr), pgtok(v.t_free)); sleep(5); i++; if(i>22) i=0; } exit(0); }
void prusage(struct rusage *r0, struct rusage *r1, struct timeval *e, struct timeval *b) { #define pgtok(p) ((p * pgsize) / 1024) static int pgsize; time_t t = (r1->ru_utime.tv_sec - r0->ru_utime.tv_sec) * 100 + (r1->ru_utime.tv_usec - r0->ru_utime.tv_usec) / 10000 + (r1->ru_stime.tv_sec - r0->ru_stime.tv_sec) * 100 + (r1->ru_stime.tv_usec - r0->ru_stime.tv_usec) / 10000; tchar *cp; int i; struct varent *vp = adrof(S_time); int ms = (e->tv_sec - b->tv_sec) * 100 + (e->tv_usec - b->tv_usec) / 10000; #ifdef TRACE tprintf("TRACE- prusage()\n"); #endif if (pgsize == 0) { pgsize = getpagesize(); } cp = S_USAGEFORMAT; /* "%Uu %Ss %E %P %X+%Dk %I+%Oio %Fpf+%Ww" */ if (vp && vp->vec[0] && vp->vec[1]) { cp = vp->vec[1]; } for (; *cp; cp++) { if (*cp != '%') { Putchar(*cp); } else if (cp[1]) { switch (*++cp) { case 'U': pdeltat(&r1->ru_utime, &r0->ru_utime); break; case 'S': pdeltat(&r1->ru_stime, &r0->ru_stime); break; case 'E': psecs_int(ms / 100); break; case 'P': printf("%d%%", (int)(t * 100 / ((ms ? ms : 1)))); break; case 'W': i = r1->ru_nswap - r0->ru_nswap; printf("%d", i); break; case 'X': printf("%d", t == 0 ? 0 : pgtok((r1->ru_ixrss - r0->ru_ixrss) / t)); break; case 'D': printf("%d", t == 0 ? 0 : pgtok((r1->ru_idrss + r1->ru_isrss- (r0->ru_idrss + r0->ru_isrss)) / t)); break; case 'K': printf("%d", t == 0 ? 0 : pgtok(((r1->ru_ixrss + r1->ru_isrss + r1->ru_idrss) - (r0->ru_ixrss + r0->ru_idrss + r0->ru_isrss)) / t)); break; case 'M': printf("%d", r1->ru_maxrss / 2); break; case 'F': printf("%d", r1->ru_majflt - r0->ru_majflt); break; case 'R': printf("%d", r1->ru_minflt - r0->ru_minflt); break; case 'I': printf("%d", r1->ru_inblock - r0->ru_inblock); break; case 'O': printf("%d", r1->ru_oublock - r0->ru_oublock); break; } } } Putchar('\n'); #undef pgtok }
void printstate(const struct kinfo_proc *kp, VARENT *ve) { int flag; char *cp, state = '\0'; VAR *v; char buf[16]; v = ve->var; flag = kp->p_flag; cp = buf; switch (kp->p_stat) { case SSTOP: *cp = 'T'; break; case SSLEEP: if (flag & P_SINTR) /* interruptible (long) */ *cp = kp->p_slptime >= maxslp ? 'I' : 'S'; else *cp = 'D'; break; case SRUN: case SIDL: case SONPROC: state = *cp = 'R'; break; case SDEAD: *cp = 'Z'; break; default: *cp = '?'; } cp++; if (kp->p_nice < NZERO) *cp++ = '<'; else if (kp->p_nice > NZERO) *cp++ = 'N'; if (kp->p_psflags & PS_TRACED) *cp++ = 'X'; if (flag & P_SYSTRACE) *cp++ = 'x'; if ((kp->p_psflags & (PS_EXITING | PS_ZOMBIE)) == PS_EXITING) *cp++ = 'E'; if (kp->p_psflags & PS_ISPWAIT) *cp++ = 'V'; if (flag & P_SYSTEM) *cp++ = 'K'; if ((flag & P_SYSTEM) == 0 && kp->p_rlim_rss_cur / 1024 < pgtok(kp->p_vm_rssize)) *cp++ = '>'; if (kp->p_eflag & EPROC_SLEADER) *cp++ = 's'; if ((kp->p_psflags & PS_CONTROLT) && kp->p__pgid == kp->p_tpgid) *cp++ = '+'; if (kp->p_psflags & PS_PLEDGE) *cp++ = 'p'; *cp = '\0'; if (state == 'R' && kp->p_cpuid != KI_NOCPU) { char pbuf[16]; snprintf(pbuf, sizeof pbuf, "/%llu", kp->p_cpuid); *++cp = '\0'; strlcat(buf, pbuf, sizeof buf); cp = buf + strlen(buf); } (void)printf("%-*s", v->width, buf); }
void dovmstat(u_int interval, int reps) { time_t uptime, halfuptime; struct clockinfo clkinfo; struct vmtotal total; size_t size; int mib[2]; uptime = getuptime(); halfuptime = uptime / 2; (void)signal(SIGCONT, needhdr); mib[0] = CTL_KERN; mib[1] = KERN_CLOCKRATE; size = sizeof(clkinfo); if (sysctl(mib, 2, &clkinfo, &size, NULL, 0) < 0) { warn("could not read kern.clockrate"); return; } hz = clkinfo.stathz; for (hdrcnt = 1;;) { /* Read new disk statistics */ dkreadstats(); if (!--hdrcnt || last.dk_ndrive != cur.dk_ndrive) printhdr(); if (nlistf == NULL && memf == NULL) { size = sizeof(struct uvmexp); mib[0] = CTL_VM; mib[1] = VM_UVMEXP; if (sysctl(mib, 2, &uvmexp, &size, NULL, 0) < 0) { warn("could not get vm.uvmexp"); bzero(&uvmexp, sizeof(struct uvmexp)); } } else { kread(X_UVMEXP, &uvmexp, sizeof(struct uvmexp)); } size = sizeof(total); mib[0] = CTL_VM; mib[1] = VM_METER; if (sysctl(mib, 2, &total, &size, NULL, 0) < 0) { warn("could not read vm.vmmeter"); bzero(&total, sizeof(total)); } (void)printf(" %u %u %u ", total.t_rq - 1, total.t_dw + total.t_pw, total.t_sw); #define rate(x) ((unsigned)((((unsigned)x) + halfuptime) / uptime)) /* round */ #define pgtok(a) ((a) * ((unsigned int)uvmexp.pagesize >> 10)) (void)printf("%6u %7u ", pgtok(uvmexp.active + uvmexp.swpginuse), pgtok(uvmexp.free)); (void)printf("%4u ", rate(uvmexp.faults - ouvmexp.faults)); (void)printf("%3u ", rate(uvmexp.pdreact - ouvmexp.pdreact)); (void)printf("%3u ", rate(uvmexp.pageins - ouvmexp.pageins)); (void)printf("%3u %3u ", rate(uvmexp.pdpageouts - ouvmexp.pdpageouts), 0); (void)printf("%3u ", rate(uvmexp.pdscans - ouvmexp.pdscans)); dkstats(); (void)printf("%4u %5u %4u ", rate(uvmexp.intrs - ouvmexp.intrs), rate(uvmexp.syscalls - ouvmexp.syscalls), rate(uvmexp.swtch - ouvmexp.swtch)); cpustats(); (void)printf("\n"); (void)fflush(stdout); if (reps >= 0 && --reps <= 0) break; ouvmexp = uvmexp; uptime = interval; /* * We round upward to avoid losing low-frequency events * (i.e., >= 1 per interval but < 1 per second). */ halfuptime = uptime == 1 ? 0 : (uptime + 1) / 2; (void)sleep(interval); } }