Fix SlowdownAmount

Summary:
This had a few bugs.
1) bottom and top were reversed. top is for the max value but the callers were passing the max
value to bottom. The result is that the max sleep is used when n >= bottom.
2) one of the callers passed values with type double and these values are frequently between
1.0 and 2.0 so rounding will do some bad things
3) sometimes the function returned 0 when there should be a stall

With this change and one other diff (out for review soon) there are slightly fewer stalls on one workload.

With the fix.
Stalls(secs): 160.166 level0_slowdown, 0.000 level0_numfiles, 0.000 memtable_compaction, 58.495 leveln_slowdown
Stalls(count): 910261 level0_slowdown, 0 level0_numfiles, 0 memtable_compaction, 54526 leveln_slowdown

Without the fix.
Stalls(secs): 172.227 level0_slowdown, 0.000 level0_numfiles, 0.000 memtable_compaction, 56.538 leveln_slowdown
Stalls(count): 160831 level0_slowdown, 0 level0_numfiles, 0 memtable_compaction, 52845 leveln_slowdown

Task ID: #

Blame Rev:

Test Plan:
run db_bench for --benchmarks=overwrite with IO-bound database

Revert Plan:

Database Impact:

Memcache Impact:

Other Notes:

EImportant:

- begin *PUBLIC* platform impact section -
Bugzilla: #
- end platform impact -

Reviewers: haobo

Reviewed By: haobo

CC: leveldb

Differential Revision: https://reviews.facebook.net/D15243
main
Mark Callaghan 11 years ago
parent e19bad9bbd
commit 439e36db21
  1. 8
      db/db_impl.cc
  2. 2
      db/db_impl.h

@ -3155,7 +3155,7 @@ void DBImpl::BuildBatchGroup(Writer** last_writer,
// The goal of this formula is to gradually increase the rate at which writes // The goal of this formula is to gradually increase the rate at which writes
// are slowed. We also tried linear delay (r * 1000), but it seemed to do // are slowed. We also tried linear delay (r * 1000), but it seemed to do
// slightly worse. There is no other particular reason for choosing quadratic. // slightly worse. There is no other particular reason for choosing quadratic.
uint64_t DBImpl::SlowdownAmount(int n, int top, int bottom) { uint64_t DBImpl::SlowdownAmount(int n, double bottom, double top) {
uint64_t delay; uint64_t delay;
if (n >= top) { if (n >= top) {
delay = 1000; delay = 1000;
@ -3167,10 +3167,10 @@ uint64_t DBImpl::SlowdownAmount(int n, int top, int bottom) {
// If we are here, we know that: // If we are here, we know that:
// level0_start_slowdown <= n < level0_slowdown // level0_start_slowdown <= n < level0_slowdown
// since the previous two conditions are false. // since the previous two conditions are false.
float how_much = double how_much =
(float) (n - bottom) / (double) (n - bottom) /
(top - bottom); (top - bottom);
delay = how_much * how_much * 1000; delay = std::max(how_much * how_much * 1000, 100.0);
} }
assert(delay <= 1000); assert(delay <= 1000);
return delay; return delay;

@ -293,7 +293,7 @@ class DBImpl : public DB {
Status WriteLevel0Table(std::vector<MemTable*> &mems, VersionEdit* edit, Status WriteLevel0Table(std::vector<MemTable*> &mems, VersionEdit* edit,
uint64_t* filenumber); uint64_t* filenumber);
uint64_t SlowdownAmount(int n, int top, int bottom); uint64_t SlowdownAmount(int n, double bottom, double top);
// MakeRoomForWrite will return superversion_to_free through an arugment, // MakeRoomForWrite will return superversion_to_free through an arugment,
// which the caller needs to delete. We do it because caller can delete // which the caller needs to delete. We do it because caller can delete
// the superversion outside of mutex // the superversion outside of mutex

Loading…
Cancel
Save