void hammer_cmd_iostats(char **av, int ac) { int mibs[9][16]; size_t lens[9]; int64_t stats[9]; int64_t copy[9]; size_t size; struct timespec delay = { 1, 0 }; int count; int i; int r; if (ac > 0) loaddelay(&delay, av[0]); lens[0] = 16; lens[1] = 16; lens[2] = 16; lens[3] = 16; lens[4] = 16; lens[5] = 16; lens[6] = 16; lens[7] = 16; lens[8] = 16; r = 0; r |= sysctlnametomib("vfs.hammer.stats_file_read", mibs[0], &lens[0]); r |= sysctlnametomib("vfs.hammer.stats_file_write", mibs[1], &lens[1]); r |= sysctlnametomib("vfs.hammer.stats_disk_read", mibs[2], &lens[2]); r |= sysctlnametomib("vfs.hammer.stats_disk_write", mibs[3], &lens[3]); r |= sysctlnametomib("vfs.hammer.stats_file_iopsr", mibs[4], &lens[4]); r |= sysctlnametomib("vfs.hammer.stats_file_iopsw", mibs[5], &lens[5]); r |= sysctlnametomib("vfs.hammer.stats_inode_flushes", mibs[6], &lens[6]); r |= sysctlnametomib("vfs.hammer.stats_commits", mibs[7], &lens[7]); r |= sysctlnametomib("vfs.hammer.stats_undo", mibs[8], &lens[8]); if (r < 0) { perror("sysctl: HAMMER stats not available"); exit(1); } for (count = 0; ; ++count) { for (i = 0; i <= 8; ++i) { size = sizeof(stats[0]); r = sysctl(mibs[i], lens[i], &stats[i], &size, NULL, 0); if (r < 0) { perror("sysctl"); exit(1); } } if (count) { if ((count & 15) == 1) printf(" file-rd file-wr dev-read dev-write inode_ops ino_flsh cmmit undo\n"); printf("%9jd %9jd %9jd %9jd %9jd %8jd %5jd %8jd\n", (intmax_t)(stats[0] - copy[0]), (intmax_t)(stats[1] - copy[1]), (intmax_t)(stats[2] - copy[2]), (intmax_t)(stats[3] - copy[3]), (intmax_t)(stats[4] + stats[5] - copy[4] - copy[5]), (intmax_t)(stats[6] - copy[6]), (intmax_t)(stats[7] - copy[7]), (intmax_t)(stats[8] - copy[8])); } nanosleep(&delay, NULL); bcopy(stats, copy, sizeof(stats)); } }
void hammer_cmd_bstats(char **av, int ac) { int mibs[8][16]; size_t lens[8]; int64_t stats[8]; int64_t copy[8]; size_t size; struct timespec delay = { 1, 0 }; int count; int i; int r; if (ac > 0) loaddelay(&delay, av[0]); lens[0] = 16; lens[1] = 16; lens[2] = 16; lens[3] = 16; lens[4] = 16; lens[5] = 16; r = 0; r |= sysctlnametomib("vfs.hammer.stats_btree_elements", mibs[0], &lens[0]); r |= sysctlnametomib("vfs.hammer.stats_btree_iterations", mibs[1], &lens[1]); r |= sysctlnametomib("vfs.hammer.stats_btree_lookups", mibs[2], &lens[2]); r |= sysctlnametomib("vfs.hammer.stats_btree_inserts", mibs[3], &lens[3]); r |= sysctlnametomib("vfs.hammer.stats_btree_deletes", mibs[4], &lens[4]); r |= sysctlnametomib("vfs.hammer.stats_btree_splits", mibs[5], &lens[5]); if (r < 0) { perror("sysctl: HAMMER stats not available:"); exit(1); } for (count = 0; ; ++count) { for (i = 0; i < 6; ++i) { size = sizeof(stats[0]); r = sysctl(mibs[i], lens[i], &stats[i], &size, NULL, 0); if (r < 0) { perror("sysctl"); exit(1); } } if (count) { if ((count & 15) == 1) printf(" elements iterations lookups inserts deletes splits\n"); printf("%10jd %10jd %10jd %10jd %10jd %10jd\n", (intmax_t)(stats[0] - copy[0]), (intmax_t)(stats[1] - copy[1]), (intmax_t)(stats[2] - copy[2]), (intmax_t)(stats[3] - copy[3]), (intmax_t)(stats[4] - copy[4]), (intmax_t)(stats[5] - copy[5])); } nanosleep(&delay, NULL); bcopy(stats, copy, sizeof(stats)); } }
int main(int ac, char **av) { const char *corefile = NULL; const char *sysfile = NULL; struct bufpcpu bpcpu; struct timespec delay = { 1, 0 }; kvm_t *kd; int count; int ncpus; int ch; int cpu; int q; while ((ch = getopt(ac, av, "M:N:v")) != -1) { switch(ch) { case 'v': ++verboseopt; break; case 'M': corefile = optarg; break; case 'N': sysfile = optarg; break; default: fprintf(stderr, "%s [-M core] [-N system]\n", av[0]); exit(1); } } ac -= optind; av += optind; if ((kd = kvm_open(sysfile, corefile, NULL, O_RDONLY, "kvm:")) == NULL) { perror("kvm_open"); exit(1); } if (kvm_nlist(kd, Nl) != 0) { perror("kvm_nlist"); exit(1); } if (ac > 0) loaddelay(&delay, av[0]); kkread(kd, Nl[1].n_value, &ncpus, sizeof(ncpus), 1); kkread(kd, Nl[2].n_value, &nbuf, sizeof(nbuf), 1); for (count = 0; ; ++count) { for (cpu = 0; cpu < ncpus; cpu++) { kkread(kd, Nl[0].n_value + cpu * sizeof(struct bufpcpu), &bpcpu, sizeof(struct bufpcpu), 1); scan_queues(kd, cpu, &bpcpu); } if (count && !verboseopt) { if ((count & 15) == 1) printf(" NONE LOCKED CLEAN DIRTY " "DIRTY_HW EMPTYKVA EMPTY OFF-QUEUE KVMFAIL\n"); printf("%6d %7d %6d %6d %9d %9d %6d %10d %7d\n", qcounter[0], qcounter[1], qcounter[2], qcounter[3], qcounter[4], qcounter[5], qcounter[6], (nbuf - totalcount), failcount); } /* If in verbose mode only output detailed bufs info once */ if (verboseopt) break; nanosleep(&delay, NULL); bzero(&qcounter, sizeof(qcounter)); totalcount = 0; failcount = 0; } return(0); }