Exemplo n.º 1
0
static void ia_histogram_merge_locked(iahistogram *src, ia_timestamp_t now)
{
	iahistogram *dst = &global.per_bench[src->bench];
	if (dst->enabled && src->acc.n != src->last.n) {
		dst->acc.latency_sum_ns += src->acc.latency_sum_ns - src->last.latency_sum_ns;
		dst->acc.latency_sum_square += src->acc.latency_sum_square - src->last.latency_sum_square;
		dst->acc.volume_sum += src->acc.volume_sum - src->last.volume_sum;
		dst->acc.n += src->acc.n - src->last.n;

		int i;
		for (i = 0; i < ST_HISTOGRAM_COUNT; i++)
			dst->buckets[i] += src->buckets[i];

		if (dst->min > src->min)
			dst->min = src->min;
		if (dst->max < src->max)
			dst->max = src->max;

		if (src->merge_evo == global.merge_evo && ia_histogram_checkpoint(now) >= 0)
			src->merge_evo += 1;
	}
}
Exemplo n.º 2
0
Arquivo: ia.c Projeto: nmter/ioarena
int ia_run(ia *a)
{
	long set_rd = 0;
	long set_wr = 0;
	iabenchmark bench;
	for (bench = IA_SET; bench < IA_MAX; bench++) {
		if (! a->conf.benchmark_list[bench])
			continue;

		ia_histogram_enable(bench);
		if (bench == IA_ITERATE || bench == IA_GET)
			set_rd |= 1l << bench;
		else
			set_wr |= 1l << bench;
	}

	if ((set_rd | set_wr) == 0)
		return 0;
	if (a->conf.rthr && set_rd == 0)
		a->conf.rthr = 0;
	if (a->conf.wthr && set_wr == 0)
		a->conf.wthr = 0;

	int key_nsectors = 1;
	if (key_nsectors < a->conf.rthr)
		key_nsectors = a->conf.rthr;
	if (key_nsectors < a->conf.wthr)
		key_nsectors = a->conf.wthr;

	int key_nspaces = 1;
	if (key_nspaces < a->conf.wthr)
		key_nspaces = a->conf.wthr;
	if (set_wr & bench_mask_2keyspace)
		key_nspaces	+= key_nspaces;

	int rc = ia_kvgen_setup(!ioarena.conf.binary, ioarena.conf.ksize,
		key_nspaces, key_nsectors, ioarena.conf.count, ioarena.conf.kvseed);
	if (rc) {
		ia_log("error: key-value generator setup failed, the options are correct?");
		return rc;
	}

	rc = pthread_barrier_init(&a->barrier_start, NULL,
		a->conf.rthr + a->conf.wthr + 1);
	if (!rc)
		rc = pthread_barrier_init(&a->barrier_fihish, NULL,
			a->conf.rthr + a->conf.wthr + 1);
	if (rc) {
		ia_log("error: pthread_barrier_init %s (%d)", strerror(errno), errno);
		return rc;
	}

	ia_histogram_csvopen(&a->conf);

	int nth = 0;
	int key_space = 0;
	rc = ia_spread(a->conf.rthr, &nth, &set_rd, set_rd, &key_space);
	if (rc)
		goto bailout;

	rc = ia_spread(a->conf.wthr, &nth, &set_wr, set_wr, &key_space);
	if (rc)
		goto bailout;

	iarusage rusage_start, rusage_fihish;
	if (set_wr | set_rd) {
		iadoer here;
		if (ia_doer_init(&here, 0, set_wr | set_rd, 0, 0))
			goto bailout;

		rc = ia_get_rusage(&rusage_start, a->datadir);
		if (rc)
			goto bailout;

		ia_sync_start(a);
		rc = ia_doer_fulfil(&here);
		ia_sync_fihish(a);

		if (rc)
			goto bailout;

		rc = ia_get_rusage(&rusage_fihish, a->datadir);
		if (rc)
			goto bailout;

		ia_doer_destroy(&here);
	} else {
		rc = ia_get_rusage(&rusage_start, a->datadir);
		if (rc)
			goto bailout;

		ia_sync_start(a);
		ia_sync_fihish(a);

		rc = ia_get_rusage(&rusage_fihish, a->datadir);
		if (rc)
			goto bailout;
	}

	if (a->failed)
		goto bailout;

	ia_histogram_checkpoint(0);
	ia_log("complete.");
	ia_histogram_print(&a->conf);

	rusage_start.ram = a->before_open_ram;
	rusage_start.disk = 0;
	ia_histogram_rusage(&a->conf, &rusage_start, &rusage_fihish);
	ia_histogram_csvclose();

	return 0;

bailout:
	exit(EXIT_FAILURE);
}