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 "
|
"Enable dynamic adjustment of rate limit according to demand for "
|
||||||
"background I/O");
|
"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,
|
DEFINE_bool(rate_limit_bg_reads, false,
|
||||||
"Use options.rate_limiter on compaction reads");
|
"Use options.rate_limiter on compaction reads");
|
||||||
|
|
||||||
@ -1480,6 +1499,7 @@ class Stats {
|
|||||||
private:
|
private:
|
||||||
int id_;
|
int id_;
|
||||||
uint64_t start_;
|
uint64_t start_;
|
||||||
|
uint64_t sine_interval_;
|
||||||
uint64_t finish_;
|
uint64_t finish_;
|
||||||
double seconds_;
|
double seconds_;
|
||||||
uint64_t done_;
|
uint64_t done_;
|
||||||
@ -1512,6 +1532,7 @@ class Stats {
|
|||||||
bytes_ = 0;
|
bytes_ = 0;
|
||||||
seconds_ = 0;
|
seconds_ = 0;
|
||||||
start_ = FLAGS_env->NowMicros();
|
start_ = FLAGS_env->NowMicros();
|
||||||
|
sine_interval_ = FLAGS_env->NowMicros();
|
||||||
finish_ = start_;
|
finish_ = start_;
|
||||||
last_report_finish_ = start_;
|
last_report_finish_ = start_;
|
||||||
message_.clear();
|
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() {
|
void ResetLastOpTime() {
|
||||||
// Set to now to avoid latency from calls to SleepForMicroseconds
|
// Set to now to avoid latency from calls to SleepForMicroseconds
|
||||||
last_op_finish_ = FLAGS_env->NowMicros();
|
last_op_finish_ = FLAGS_env->NowMicros();
|
||||||
@ -3350,6 +3383,9 @@ void VerifyDBFromDB(std::string& truth_db_name) {
|
|||||||
FLAGS_env->LowerThreadPoolCPUPriority(Env::HIGH);
|
FLAGS_env->LowerThreadPoolCPUPriority(Env::HIGH);
|
||||||
}
|
}
|
||||||
options.env = FLAGS_env;
|
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_limiter_bytes_per_sec > 0) {
|
||||||
if (FLAGS_rate_limit_bg_reads &&
|
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) {
|
void DoWrite(ThreadState* thread, WriteMode write_mode) {
|
||||||
const int test_duration = write_mode == RANDOM ? FLAGS_duration : 0;
|
const int test_duration = write_mode == RANDOM ? FLAGS_duration : 0;
|
||||||
const int64_t num_ops = writes_ == 0 ? num_ : writes_;
|
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,
|
thread->stats.FinishedOps(db_with_cfh, db_with_cfh->db,
|
||||||
entries_per_batch_, kWrite);
|
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()) {
|
if (!s.ok()) {
|
||||||
fprintf(stderr, "put error: %s\n", s.ToString().c_str());
|
fprintf(stderr, "put error: %s\n", s.ToString().c_str());
|
||||||
exit(1);
|
exit(1);
|
||||||
|
Loading…
Reference in New Issue
Block a user