diff --git a/tools/db_bench_tool.cc b/tools/db_bench_tool.cc index 6d24e3c3e..a1634ce7d 100644 --- a/tools/db_bench_tool.cc +++ b/tools/db_bench_tool.cc @@ -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(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(now - thread->stats.GetStart()); + thread->stats.ResetSineInterval(); + uint64_t write_rate = + static_cast(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);