Fix issues for reproducing synthetic ZippyDB workloads in the FAST20' paper (#6795)
Summary: Fix issues for reproducing synthetic ZippyDB workloads in the FAST20' paper using db_bench. Details changes as follows. 1, add a separate random mode in MixGraph to produce all_random workload. 2, fix power inverse function for generating prefix_dist workload. 3, make sure key_offset in prefix mode is always unsigned. note: Need to carefully choose key_dist_a/b to avoid aliasing. Power inverse function range should be close to overall key space. Pull Request resolved: https://github.com/facebook/rocksdb/pull/6795 Reviewed By: akankshamahajan15 Differential Revision: D21371095 Pulled By: zhichao-cao fbshipit-source-id: 80744381e242392c8c7cf8ac3d68fe67fe876048
This commit is contained in:
parent
211088df6e
commit
d9e170d82b
@ -5415,13 +5415,15 @@ class Benchmark {
|
|||||||
|
|
||||||
// Select one key in the key-range and compose the keyID
|
// Select one key in the key-range and compose the keyID
|
||||||
int64_t key_offset = 0, key_seed;
|
int64_t key_offset = 0, key_seed;
|
||||||
if (key_dist_a == 0.0 && key_dist_b == 0.0) {
|
if (key_dist_a == 0.0 || key_dist_b == 0.0) {
|
||||||
key_offset = ini_rand % keyrange_size_;
|
key_offset = ini_rand % keyrange_size_;
|
||||||
} else {
|
} else {
|
||||||
|
double u =
|
||||||
|
static_cast<double>(ini_rand % keyrange_size_) / keyrange_size_;
|
||||||
key_seed = static_cast<int64_t>(
|
key_seed = static_cast<int64_t>(
|
||||||
ceil(std::pow((ini_rand / key_dist_a), (1 / key_dist_b))));
|
ceil(std::pow((u / key_dist_a), (1 / key_dist_b))));
|
||||||
Random64 rand_key(key_seed);
|
Random64 rand_key(key_seed);
|
||||||
key_offset = static_cast<int64_t>(rand_key.Next()) % keyrange_size_;
|
key_offset = rand_key.Next() % keyrange_size_;
|
||||||
}
|
}
|
||||||
return keyrange_size_ * keyrange_id + key_offset;
|
return keyrange_size_ * keyrange_id + key_offset;
|
||||||
}
|
}
|
||||||
@ -5448,6 +5450,7 @@ class Benchmark {
|
|||||||
double write_rate = 1000000.0;
|
double write_rate = 1000000.0;
|
||||||
double read_rate = 1000000.0;
|
double read_rate = 1000000.0;
|
||||||
bool use_prefix_modeling = false;
|
bool use_prefix_modeling = false;
|
||||||
|
bool use_random_modeling = false;
|
||||||
GenerateTwoTermExpKeys gen_exp;
|
GenerateTwoTermExpKeys gen_exp;
|
||||||
std::vector<double> ratio{FLAGS_mix_get_ratio, FLAGS_mix_put_ratio,
|
std::vector<double> ratio{FLAGS_mix_get_ratio, FLAGS_mix_put_ratio,
|
||||||
FLAGS_mix_seek_ratio};
|
FLAGS_mix_seek_ratio};
|
||||||
@ -5482,6 +5485,9 @@ class Benchmark {
|
|||||||
FLAGS_num, FLAGS_keyrange_dist_a, FLAGS_keyrange_dist_b,
|
FLAGS_num, FLAGS_keyrange_dist_a, FLAGS_keyrange_dist_b,
|
||||||
FLAGS_keyrange_dist_c, FLAGS_keyrange_dist_d);
|
FLAGS_keyrange_dist_c, FLAGS_keyrange_dist_d);
|
||||||
}
|
}
|
||||||
|
if (FLAGS_key_dist_a == 0 || FLAGS_key_dist_b == 0) {
|
||||||
|
use_random_modeling = true;
|
||||||
|
}
|
||||||
|
|
||||||
Duration duration(FLAGS_duration, reads_);
|
Duration duration(FLAGS_duration, reads_);
|
||||||
while (!duration.Done(1)) {
|
while (!duration.Done(1)) {
|
||||||
@ -5492,7 +5498,9 @@ class Benchmark {
|
|||||||
double u = static_cast<double>(rand_v) / FLAGS_num;
|
double u = static_cast<double>(rand_v) / FLAGS_num;
|
||||||
|
|
||||||
// Generate the keyID based on the key hotness and prefix hotness
|
// Generate the keyID based on the key hotness and prefix hotness
|
||||||
if (use_prefix_modeling) {
|
if (use_random_modeling) {
|
||||||
|
key_rand = ini_rand;
|
||||||
|
} else if (use_prefix_modeling) {
|
||||||
key_rand =
|
key_rand =
|
||||||
gen_exp.DistGetKeyID(ini_rand, FLAGS_key_dist_a, FLAGS_key_dist_b);
|
gen_exp.DistGetKeyID(ini_rand, FLAGS_key_dist_a, FLAGS_key_dist_b);
|
||||||
} else {
|
} else {
|
||||||
|
Loading…
Reference in New Issue
Block a user