Пример #1
0
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));
	}
}
Пример #2
0
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));
	}
}
Пример #3
0
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);
}