2010-04-29 01:03:56 +00:00
|
|
|
/*
|
|
|
|
* mergeStats.h
|
|
|
|
*
|
|
|
|
* Created on: Apr 27, 2010
|
|
|
|
* Author: sears
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef MERGESTATS_H_
|
|
|
|
#define MERGESTATS_H_
|
|
|
|
|
|
|
|
#include <stasis/common.h>
|
2010-05-19 23:42:06 +00:00
|
|
|
#undef try
|
|
|
|
#undef end
|
2010-04-29 01:03:56 +00:00
|
|
|
|
2010-05-19 23:42:06 +00:00
|
|
|
#include <sys/time.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
#include "datatuple.h"
|
|
|
|
#include "datapage.h"
|
2010-06-02 21:47:58 +00:00
|
|
|
|
|
|
|
#include <mergeManager.h> // XXX for double_to_ts, etc... create a util class.
|
2010-04-29 23:13:04 +00:00
|
|
|
|
2010-05-19 23:42:06 +00:00
|
|
|
class mergeStats {
|
2010-04-29 23:13:04 +00:00
|
|
|
public:
|
2010-06-02 21:47:58 +00:00
|
|
|
mergeStats(int merge_level, int64_t target_size) :
|
2010-04-29 23:13:04 +00:00
|
|
|
merge_level(merge_level),
|
|
|
|
merge_count(0),
|
2010-05-26 00:58:17 +00:00
|
|
|
base_size(0),
|
2010-05-28 21:20:26 +00:00
|
|
|
target_size(target_size),
|
2010-05-26 00:58:17 +00:00
|
|
|
current_size(0),
|
2010-05-21 23:43:17 +00:00
|
|
|
mergeable_size(0),
|
|
|
|
bytes_out_with_overhead(0),
|
2010-04-29 23:13:04 +00:00
|
|
|
bytes_out(0),
|
|
|
|
num_tuples_out(0),
|
|
|
|
num_datapages_out(0),
|
|
|
|
bytes_in_small(0),
|
2010-05-12 22:16:41 +00:00
|
|
|
bytes_in_small_delta(0),
|
2010-04-29 23:13:04 +00:00
|
|
|
num_tuples_in_small(0),
|
|
|
|
bytes_in_large(0),
|
2010-05-12 22:16:41 +00:00
|
|
|
num_tuples_in_large(0),
|
2010-05-26 00:58:17 +00:00
|
|
|
just_handed_off(false),
|
|
|
|
lifetime_elapsed(0),
|
|
|
|
lifetime_consumed(0),
|
|
|
|
window_elapsed(0.001),
|
|
|
|
window_consumed(0),
|
2010-06-02 21:47:58 +00:00
|
|
|
print_skipped(0),
|
2010-05-12 22:16:41 +00:00
|
|
|
active(false) {
|
2010-04-29 23:13:04 +00:00
|
|
|
gettimeofday(&sleep,0);
|
2010-05-12 22:16:41 +00:00
|
|
|
gettimeofday(&last,0);
|
2010-06-02 21:47:58 +00:00
|
|
|
mergeManager::double_to_ts(&last_tick, mergeManager::tv_to_double(&last));
|
2010-04-29 01:03:56 +00:00
|
|
|
}
|
2010-06-02 21:47:58 +00:00
|
|
|
void new_merge2() {
|
2010-05-26 00:58:17 +00:00
|
|
|
if(just_handed_off) {
|
|
|
|
bytes_out = 0;
|
|
|
|
just_handed_off = false;
|
|
|
|
}
|
|
|
|
base_size = bytes_out;
|
|
|
|
current_size = base_size;
|
2010-04-29 23:13:04 +00:00
|
|
|
merge_count++;
|
2010-05-26 00:58:17 +00:00
|
|
|
bytes_out_with_overhead = 0;
|
|
|
|
bytes_out = 0;
|
2010-04-29 23:13:04 +00:00
|
|
|
num_tuples_out = 0;
|
|
|
|
num_datapages_out = 0;
|
|
|
|
bytes_in_small = 0;
|
2010-05-12 22:16:41 +00:00
|
|
|
bytes_in_small_delta = 0;
|
2010-04-29 23:13:04 +00:00
|
|
|
num_tuples_in_small = 0;
|
2010-05-26 00:58:17 +00:00
|
|
|
bytes_in_large = 0;
|
2010-04-29 23:13:04 +00:00
|
|
|
num_tuples_in_large = 0;
|
|
|
|
gettimeofday(&sleep,0);
|
2010-04-29 01:03:56 +00:00
|
|
|
}
|
2010-04-29 23:13:04 +00:00
|
|
|
void starting_merge() {
|
2010-05-12 22:16:41 +00:00
|
|
|
active = true;
|
2010-04-29 23:13:04 +00:00
|
|
|
gettimeofday(&start, 0);
|
2010-05-12 22:16:41 +00:00
|
|
|
gettimeofday(&last, 0);
|
2010-06-02 21:47:58 +00:00
|
|
|
mergeManager::double_to_ts(&last_tick, mergeManager::tv_to_double(&last));
|
2010-05-26 00:58:17 +00:00
|
|
|
|
2010-04-29 23:13:04 +00:00
|
|
|
}
|
2010-05-21 23:43:17 +00:00
|
|
|
void handed_off_tree() {
|
2010-05-26 00:58:17 +00:00
|
|
|
if(merge_level == 2) {
|
|
|
|
} else {
|
|
|
|
mergeable_size = current_size;
|
|
|
|
just_handed_off = true;
|
|
|
|
}
|
2010-05-21 23:43:17 +00:00
|
|
|
}
|
2010-04-29 23:13:04 +00:00
|
|
|
void read_tuple_from_large_component(datatuple * tup) {
|
|
|
|
if(tup) {
|
|
|
|
num_tuples_in_large++;
|
|
|
|
bytes_in_large += tup->byte_length();
|
|
|
|
}
|
|
|
|
}
|
2010-05-12 22:16:41 +00:00
|
|
|
void merged_tuples(datatuple * merged, datatuple * small, datatuple * large) {
|
|
|
|
}
|
2010-04-29 23:13:04 +00:00
|
|
|
void wrote_datapage(DataPage<datatuple> *dp) {
|
|
|
|
num_datapages_out++;
|
2010-05-21 23:43:17 +00:00
|
|
|
bytes_out_with_overhead += (PAGE_SIZE * dp->get_page_count());
|
2010-04-29 23:13:04 +00:00
|
|
|
}
|
|
|
|
pageid_t output_size() {
|
|
|
|
return bytes_out;
|
|
|
|
}
|
2010-06-02 21:47:58 +00:00
|
|
|
const int merge_level; // 1 => C0->C1, 2 => C1->C2
|
2010-04-29 23:13:04 +00:00
|
|
|
protected:
|
|
|
|
pageid_t merge_count; // This is the merge_count'th merge
|
|
|
|
struct timeval sleep; // When did we go to sleep waiting for input?
|
2010-04-29 01:03:56 +00:00
|
|
|
struct timeval start; // When did we wake up and start merging? (at steady state with max throughput, this should be equal to sleep)
|
|
|
|
struct timeval done; // When did we finish merging?
|
2010-05-12 22:16:41 +00:00
|
|
|
struct timeval last;
|
2010-04-29 01:03:56 +00:00
|
|
|
|
|
|
|
double float_tv(struct timeval& tv) {
|
|
|
|
return ((double)tv.tv_sec) + ((double)tv.tv_usec) / 1000000.0;
|
|
|
|
}
|
2010-04-29 23:13:04 +00:00
|
|
|
friend class mergeManager;
|
2010-06-02 21:47:58 +00:00
|
|
|
|
2010-05-21 23:43:17 +00:00
|
|
|
struct timespec last_tick;
|
|
|
|
|
2010-05-26 00:58:17 +00:00
|
|
|
pageid_t base_size;
|
|
|
|
pageid_t target_size;
|
|
|
|
pageid_t current_size;
|
2010-06-02 21:47:58 +00:00
|
|
|
pageid_t mergeable_size; // protected by mutex.
|
2010-04-29 01:03:56 +00:00
|
|
|
|
2010-05-21 23:43:17 +00:00
|
|
|
pageid_t bytes_out_with_overhead;// How many bytes did we write (including internal tree nodes)?
|
2010-05-26 00:58:17 +00:00
|
|
|
pageid_t bytes_out; // How many bytes worth of tuples did we write?
|
2010-04-29 01:03:56 +00:00
|
|
|
pageid_t num_tuples_out; // How many tuples did we write?
|
|
|
|
pageid_t num_datapages_out; // How many datapages?
|
|
|
|
pageid_t bytes_in_small; // How many bytes from the small input tree (for C0, we ignore tree overheads)?
|
2010-05-12 22:16:41 +00:00
|
|
|
pageid_t bytes_in_small_delta; // How many bytes from the small input tree during this tick (for C0, we ignore tree overheads)?
|
2010-04-29 01:03:56 +00:00
|
|
|
pageid_t num_tuples_in_small; // Tuples from the small input?
|
|
|
|
pageid_t bytes_in_large; // Bytes from the large input?
|
|
|
|
pageid_t num_tuples_in_large; // Tuples from large input?
|
2010-05-26 00:58:17 +00:00
|
|
|
|
|
|
|
bool just_handed_off;
|
|
|
|
|
|
|
|
double lifetime_elapsed;
|
|
|
|
double lifetime_consumed;
|
|
|
|
double window_elapsed;
|
|
|
|
double window_consumed;
|
|
|
|
|
2010-06-02 21:47:58 +00:00
|
|
|
int print_skipped; // used by pretty print in mergeManager.
|
|
|
|
|
2010-05-12 22:16:41 +00:00
|
|
|
bool active;
|
2010-04-29 23:13:04 +00:00
|
|
|
public:
|
2010-04-29 01:03:56 +00:00
|
|
|
|
|
|
|
void pretty_print(FILE* fd) {
|
2010-04-29 23:13:04 +00:00
|
|
|
double sleep_time = float_tv(start) - float_tv(sleep);
|
|
|
|
double work_time = float_tv(done) - float_tv(start);
|
|
|
|
double total_time = sleep_time + work_time;
|
2010-05-21 23:43:17 +00:00
|
|
|
double mb_out = ((double)bytes_out_with_overhead) /(1024.0*1024.0);
|
2010-04-29 23:13:04 +00:00
|
|
|
double mb_ins = ((double)bytes_in_small) /(1024.0*1024.0);
|
|
|
|
double mb_inl = ((double)bytes_in_large) /(1024.0*1024.0);
|
|
|
|
double kt_out = ((double)num_tuples_out) /(1024.0);
|
|
|
|
double kt_ins= ((double)num_tuples_in_small) /(1024.0);
|
|
|
|
double kt_inl = ((double)num_tuples_in_large) /(1024.0);
|
|
|
|
double mb_hdd = mb_out + mb_inl + (merge_level == 1 ? 0.0 : mb_ins);
|
|
|
|
double kt_hdd = kt_out + kt_inl + (merge_level == 1 ? 0.0 : kt_ins);
|
2010-04-29 01:03:56 +00:00
|
|
|
|
|
|
|
|
2010-04-29 23:13:04 +00:00
|
|
|
fprintf(fd,
|
|
|
|
"=====================================================================\n"
|
|
|
|
"Thread %d merge %lld: sleep %6.2f sec, run %6.2f sec\n"
|
|
|
|
" megabytes kTuples datapages MB/s (real) kTup/s (real)\n"
|
|
|
|
"Wrote %7lld %7lld %9lld" " %6.1f %6.1f" " %8.1f %8.1f" "\n"
|
|
|
|
"Read (small) %7lld %7lld - " " %6.1f %6.1f" " %8.1f %8.1f" "\n"
|
|
|
|
"Read (large) %7lld %7lld - " " %6.1f %6.1f" " %8.1f %8.1f" "\n"
|
|
|
|
"Disk %7lld %7lld - " " %6.1f %6.1f" " %8.1f %8.1f" "\n"
|
|
|
|
".....................................................................\n"
|
|
|
|
"avg tuple len: %6.2fkb\n"
|
|
|
|
"effective throughput: (mb/s ; nsec/byte): (%.2f; %.2f) active" "\n"
|
|
|
|
" (%.2f; %.2f) wallclock" "\n"
|
|
|
|
".....................................................................\n"
|
|
|
|
,
|
|
|
|
merge_level, merge_count,
|
|
|
|
sleep_time,
|
|
|
|
work_time,
|
|
|
|
(long long)mb_out, (long long)kt_out, num_datapages_out, mb_out / work_time, mb_out / total_time, kt_out / work_time, kt_out / total_time,
|
|
|
|
(long long)mb_ins, (long long)kt_ins, mb_ins / work_time, mb_ins / total_time, kt_ins / work_time, kt_ins / total_time,
|
|
|
|
(long long)mb_inl, (long long)kt_inl, mb_inl / work_time, mb_inl / total_time, kt_inl / work_time, kt_inl / total_time,
|
|
|
|
(long long)mb_hdd, (long long)kt_hdd, mb_hdd / work_time, mb_hdd / total_time, kt_hdd / work_time, kt_hdd / total_time,
|
|
|
|
mb_out / kt_out,
|
|
|
|
mb_ins / work_time, 1000.0 * work_time / mb_ins, mb_ins / total_time, 1000.0 * total_time / mb_ins
|
|
|
|
);
|
2010-04-29 01:03:56 +00:00
|
|
|
}
|
2010-04-29 23:13:04 +00:00
|
|
|
};
|
|
|
|
|
2010-04-29 01:03:56 +00:00
|
|
|
#endif /* MERGESTATS_H_ */
|