Benchmark sine wave write rate limit (#3914)
Summary: As mentioned at the [dev forum.](https://www.facebook.com/groups/rocksdb.dev/1693425187422655/) Let me know if you would like me to do any changes! Closes https://github.com/facebook/rocksdb/pull/3914 Differential Revision: D8452824 Pulled By: siying fbshipit-source-id: 56439b3228ecdcc5a199d5198eff2fab553be961
This commit is contained in:
parent
f5281a53a4
commit
4faaab70a6
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user