|
|
|
@ -889,6 +889,25 @@ DEFINE_bool(rate_limiter_auto_tuned, false, |
|
|
|
|
"Enable dynamic adjustment of rate limit according to demand for " |
|
|
|
|
"background I/O"); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
DEFINE_bool(sine_write_rate, false, |
|
|
|
|
"Use a sine wave write_rate_limit"); |
|
|
|
|
|
|
|
|
|
DEFINE_uint64(sine_write_rate_interval_milliseconds, 10000, |
|
|
|
|
"Interval of which the sine wave write_rate_limit is recalculated"); |
|
|
|
|
|
|
|
|
|
DEFINE_double(sine_a, 1, |
|
|
|
|
"A in f(x) = A sin(bx + c) + d"); |
|
|
|
|
|
|
|
|
|
DEFINE_double(sine_b, 1, |
|
|
|
|
"B in f(x) = A sin(bx + c) + d"); |
|
|
|
|
|
|
|
|
|
DEFINE_double(sine_c, 0, |
|
|
|
|
"C in f(x) = A sin(bx + c) + d"); |
|
|
|
|
|
|
|
|
|
DEFINE_double(sine_d, 1, |
|
|
|
|
"D in f(x) = A sin(bx + c) + d"); |
|
|
|
|
|
|
|
|
|
DEFINE_bool(rate_limit_bg_reads, false, |
|
|
|
|
"Use options.rate_limiter on compaction reads"); |
|
|
|
|
|
|
|
|
@ -1480,6 +1499,7 @@ class Stats { |
|
|
|
|
private: |
|
|
|
|
int id_; |
|
|
|
|
uint64_t start_; |
|
|
|
|
uint64_t sine_interval_; |
|
|
|
|
uint64_t finish_; |
|
|
|
|
double seconds_; |
|
|
|
|
uint64_t done_; |
|
|
|
@ -1512,6 +1532,7 @@ class Stats { |
|
|
|
|
bytes_ = 0; |
|
|
|
|
seconds_ = 0; |
|
|
|
|
start_ = FLAGS_env->NowMicros(); |
|
|
|
|
sine_interval_ = FLAGS_env->NowMicros(); |
|
|
|
|
finish_ = start_; |
|
|
|
|
last_report_finish_ = start_; |
|
|
|
|
message_.clear(); |
|
|
|
@ -1584,6 +1605,18 @@ class Stats { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ResetSineInterval() { |
|
|
|
|
sine_interval_ = FLAGS_env->NowMicros(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint64_t GetSineInterval() { |
|
|
|
|
return sine_interval_; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
uint64_t GetStart() { |
|
|
|
|
return start_; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ResetLastOpTime() { |
|
|
|
|
// Set to now to avoid latency from calls to SleepForMicroseconds
|
|
|
|
|
last_op_finish_ = FLAGS_env->NowMicros(); |
|
|
|
@ -3350,6 +3383,9 @@ void VerifyDBFromDB(std::string& truth_db_name) { |
|
|
|
|
FLAGS_env->LowerThreadPoolCPUPriority(Env::HIGH); |
|
|
|
|
} |
|
|
|
|
options.env = FLAGS_env; |
|
|
|
|
if (FLAGS_sine_write_rate) { |
|
|
|
|
FLAGS_benchmark_write_rate_limit = static_cast<uint64_t>(SineRate(0)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (FLAGS_rate_limiter_bytes_per_sec > 0) { |
|
|
|
|
if (FLAGS_rate_limit_bg_reads && |
|
|
|
@ -3583,6 +3619,10 @@ void VerifyDBFromDB(std::string& truth_db_name) { |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
double SineRate(double x) { |
|
|
|
|
return FLAGS_sine_a*sin((FLAGS_sine_b*x) + FLAGS_sine_c) + FLAGS_sine_d; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DoWrite(ThreadState* thread, WriteMode write_mode) { |
|
|
|
|
const int test_duration = write_mode == RANDOM ? FLAGS_duration : 0; |
|
|
|
|
const int64_t num_ops = writes_ == 0 ? num_ : writes_; |
|
|
|
@ -3728,6 +3768,27 @@ void VerifyDBFromDB(std::string& truth_db_name) { |
|
|
|
|
} |
|
|
|
|
thread->stats.FinishedOps(db_with_cfh, db_with_cfh->db, |
|
|
|
|
entries_per_batch_, kWrite); |
|
|
|
|
if (FLAGS_sine_write_rate) { |
|
|
|
|
uint64_t now = FLAGS_env->NowMicros(); |
|
|
|
|
|
|
|
|
|
uint64_t usecs_since_last; |
|
|
|
|
if (now > thread->stats.GetSineInterval()) { |
|
|
|
|
usecs_since_last = now - thread->stats.GetSineInterval(); |
|
|
|
|
} else { |
|
|
|
|
usecs_since_last = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (usecs_since_last > |
|
|
|
|
(FLAGS_sine_write_rate_interval_milliseconds * uint64_t{1000})) { |
|
|
|
|
double usecs_since_start = |
|
|
|
|
static_cast<double>(now - thread->stats.GetStart()); |
|
|
|
|
thread->stats.ResetSineInterval(); |
|
|
|
|
uint64_t write_rate = |
|
|
|
|
static_cast<uint64_t>(SineRate(usecs_since_start / 1000000.0)); |
|
|
|
|
thread->shared->write_rate_limiter.reset( |
|
|
|
|
NewGenericRateLimiter(write_rate)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (!s.ok()) { |
|
|
|
|
fprintf(stderr, "put error: %s\n", s.ToString().c_str()); |
|
|
|
|
exit(1); |
|
|
|
|