static void getinfo(struct Info *ls) { struct devinfo *tmp_dinfo; struct nchstats *nch_tmp; size_t size; size_t vms_size = sizeof(ls->Vms); size_t vmm_size = sizeof(ls->Vmm); size_t nch_size = sizeof(ls->nchstats) * SMP_MAXCPU; if (sysctlbyname("vm.vmstats", &ls->Vms, &vms_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } if (sysctlbyname("vm.vmmeter", &ls->Vmm, &vmm_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } if (kinfo_get_sched_cputime(&ls->cp_time)) err(1, "kinfo_get_sched_cputime"); if (kinfo_get_sched_cputime(&cp_time)) err(1, "kinfo_get_sched_cputime"); NREAD(X_BUFFERSPACE, &ls->bufspace, sizeof(ls->bufspace)); NREAD(X_DESIREDVNODES, &ls->desiredvnodes, sizeof(ls->desiredvnodes)); NREAD(X_NUMVNODES, &ls->numvnodes, sizeof(ls->numvnodes)); NREAD(X_FREEVNODES, &ls->freevnodes, sizeof(ls->freevnodes)); NREAD(X_NUMDIRTYBUFFERS, &ls->dirtybufspace, sizeof(ls->dirtybufspace)); if (nintr) { size = nintr * sizeof(ls->intrcnt[0]); sysctlbyname("hw.intrcnt_all", ls->intrcnt, &size, NULL, 0); } size = sizeof(ls->Total); if (sysctlbyname("vm.vmtotal", &ls->Total, &size, NULL, 0) < 0) { error("Can't get kernel info: %s\n", strerror(errno)); bzero(&ls->Total, sizeof(ls->Total)); } if ((nch_tmp = malloc(nch_size)) == NULL) { perror("malloc"); exit(1); } else { if (sysctlbyname("vfs.cache.nchstats", nch_tmp, &nch_size, NULL, 0)) { perror("sysctlbyname vfs.cache.nchstats"); free(nch_tmp); exit(1); } else { if ((nch_tmp = realloc(nch_tmp, nch_size)) == NULL) { perror("realloc"); exit(1); } } } if (kinfo_get_cpus(&ncpu)) err(1, "kinfo_get_cpus"); kvm_nch_cpuagg(nch_tmp, &ls->nchstats, ncpu); free(nch_tmp); tmp_dinfo = last.dinfo; last.dinfo = cur.dinfo; cur.dinfo = tmp_dinfo; last.busy_time = cur.busy_time; switch (getdevs(&cur)) { case -1: errx(1, "%s", devstat_errbuf); break; case 1: num_devices = cur.dinfo->numdevs; generation = cur.dinfo->generation; cmdkre("refresh", NULL); break; default: break; } }
static void dosum(void) { struct nchstats *nch_tmp, nchstats; size_t vms_size = sizeof(vms); size_t vmm_size = sizeof(vmm); int cpucnt; u_long nchtotal; u_long nchpathtotal; size_t nch_size = sizeof(struct nchstats) * SMP_MAXCPU; if (sysctlbyname("vm.vmstats", &vms, &vms_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } if (sysctlbyname("vm.vmmeter", &vmm, &vmm_size, NULL, 0)) { perror("sysctlbyname: vm.vmstats"); exit(1); } printf("%9u cpu context switches\n", vmm.v_swtch); printf("%9u device interrupts\n", vmm.v_intr); printf("%9u software interrupts\n", vmm.v_soft); printf("%9u traps\n", vmm.v_trap); printf("%9u system calls\n", vmm.v_syscall); printf("%9u kernel threads created\n", vmm.v_kthreads); printf("%9u fork() calls\n", vmm.v_forks); printf("%9u vfork() calls\n", vmm.v_vforks); printf("%9u rfork() calls\n", vmm.v_rforks); printf("%9u exec() calls\n", vmm.v_exec); printf("%9u swap pager pageins\n", vmm.v_swapin); printf("%9u swap pager pages paged in\n", vmm.v_swappgsin); printf("%9u swap pager pageouts\n", vmm.v_swapout); printf("%9u swap pager pages paged out\n", vmm.v_swappgsout); printf("%9u vnode pager pageins\n", vmm.v_vnodein); printf("%9u vnode pager pages paged in\n", vmm.v_vnodepgsin); printf("%9u vnode pager pageouts\n", vmm.v_vnodeout); printf("%9u vnode pager pages paged out\n", vmm.v_vnodepgsout); printf("%9u page daemon wakeups\n", vmm.v_pdwakeups); printf("%9u pages examined by the page daemon\n", vmm.v_pdpages); printf("%9u pages reactivated\n", vmm.v_reactivated); printf("%9u copy-on-write faults\n", vmm.v_cow_faults); printf("%9u copy-on-write optimized faults\n", vmm.v_cow_optim); printf("%9u zero fill pages zeroed\n", vmm.v_zfod); printf("%9u zero fill pages prezeroed\n", vmm.v_ozfod); printf("%9u intransit blocking page faults\n", vmm.v_intrans); printf("%9u total VM faults taken\n", vmm.v_vm_faults); printf("%9u pages affected by kernel thread creation\n", vmm.v_kthreadpages); printf("%9u pages affected by fork()\n", vmm.v_forkpages); printf("%9u pages affected by vfork()\n", vmm.v_vforkpages); printf("%9u pages affected by rfork()\n", vmm.v_rforkpages); printf("%9u pages freed\n", vmm.v_tfree); printf("%9u pages freed by daemon\n", vmm.v_dfree); printf("%9u pages freed by exiting processes\n", vmm.v_pfree); printf("%9u pages active\n", vms.v_active_count); printf("%9u pages inactive\n", vms.v_inactive_count); printf("%9u pages in VM cache\n", vms.v_cache_count); printf("%9u pages wired down\n", vms.v_wire_count); printf("%9u pages free\n", vms.v_free_count); printf("%9u bytes per page\n", vms.v_page_size); printf("%9u global smp invltlbs\n", vmm.v_smpinvltlb); if ((nch_tmp = malloc(nch_size)) == NULL) { perror("malloc"); exit(1); } else { if (sysctlbyname("vfs.cache.nchstats", nch_tmp, &nch_size, NULL, 0)) { perror("sysctlbyname vfs.cache.nchstats"); free(nch_tmp); exit(1); } else { if ((nch_tmp = realloc(nch_tmp, nch_size)) == NULL) { perror("realloc"); exit(1); } } } cpucnt = nch_size / sizeof(struct nchstats); kvm_nch_cpuagg(nch_tmp, &nchstats, cpucnt); nchtotal = nchstats.ncs_goodhits + nchstats.ncs_neghits + nchstats.ncs_badhits + nchstats.ncs_falsehits + nchstats.ncs_miss; nchpathtotal = nchstats.ncs_longhits + nchstats.ncs_longmiss; printf("%9ld total path lookups\n", nchpathtotal); printf("%9ld total component lookups\n", nchtotal); printf( "%9s cache hits (%ld%% pos + %ld%% neg)\n", "", PCT(nchstats.ncs_goodhits, nchtotal), PCT(nchstats.ncs_neghits, nchtotal)); printf("%9s deletions %ld%%, falsehits %ld%%\n", "", PCT(nchstats.ncs_badhits, nchtotal), PCT(nchstats.ncs_falsehits, nchtotal)); free(nch_tmp); }