Skip to content

Commit b1b0f3d

Browse files
Rocksdb stats level knob.
1 parent cf0aed4 commit b1b0f3d

File tree

3 files changed

+38
-35
lines changed

3 files changed

+38
-35
lines changed

fdbclient/ServerKnobs.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -388,8 +388,8 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
388388
init( ROCKSDB_FETCH_QUEUE_SOFT_MAX, 50 );
389389
init( ROCKSDB_HISTOGRAMS_SAMPLE_RATE, 0.001 ); if( randomize && BUGGIFY ) ROCKSDB_HISTOGRAMS_SAMPLE_RATE = 0;
390390
init( ROCKSDB_READ_RANGE_ITERATOR_REFRESH_TIME, 30.0 ); if( randomize && BUGGIFY ) ROCKSDB_READ_RANGE_ITERATOR_REFRESH_TIME = 0.1;
391-
init( ROCKSDB_READ_RANGE_REUSE_ITERATORS, true ); if( randomize && BUGGIFY ) ROCKSDB_READ_RANGE_REUSE_ITERATORS = deterministicRandom()->coinflip() ? true : false;
392-
init( ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS, false ); if( randomize && BUGGIFY ) ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS = deterministicRandom()->coinflip() ? true : false;
391+
init( ROCKSDB_READ_RANGE_REUSE_ITERATORS, true ); if( randomize && BUGGIFY ) ROCKSDB_READ_RANGE_REUSE_ITERATORS = deterministicRandom()->coinflip();
392+
init( ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS, false ); if( randomize && BUGGIFY ) ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS = deterministicRandom()->coinflip();
393393
init( ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT, 200 );
394394
// Set to 0 to disable rocksdb write rate limiting. Rate limiter unit: bytes per second.
395395
init( ROCKSDB_WRITE_RATE_LIMITER_BYTES_PER_SEC, 0 );
@@ -398,8 +398,8 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
398398
init( DEFAULT_FDB_ROCKSDB_COLUMN_FAMILY, "fdb");
399399
init( ROCKSDB_DISABLE_AUTO_COMPACTIONS, false ); // RocksDB default
400400

401-
init( ROCKSDB_PERFCONTEXT_ENABLE, false ); if( randomize && BUGGIFY ) ROCKSDB_PERFCONTEXT_ENABLE = deterministicRandom()->coinflip() ? false : true;
402-
init( ROCKSDB_PERFCONTEXT_SAMPLE_RATE, 0.0001 );
401+
init( ROCKSDB_PERFCONTEXT_ENABLE, false ); if( randomize && BUGGIFY ) ROCKSDB_PERFCONTEXT_ENABLE = deterministicRandom()->coinflip();
402+
init( ROCKSDB_PERFCONTEXT_SAMPLE_RATE, 0.0001 );
403403
init( ROCKSDB_MAX_SUBCOMPACTIONS, 2 );
404404
init( ROCKSDB_SOFT_PENDING_COMPACT_BYTES_LIMIT, 64000000000 ); // 64GB, Rocksdb option, Writes will slow down.
405405
init( ROCKSDB_HARD_PENDING_COMPACT_BYTES_LIMIT, 100000000000 ); // 100GB, Rocksdb option, Writes will stall.
@@ -409,9 +409,11 @@ void ServerKnobs::initialize(Randomize randomize, ClientKnobs* clientKnobs, IsSi
409409
init( ROCKSDB_DISABLE_WAL_EXPERIMENTAL, false );
410410
// If ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE is enabled, disable ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS knob.
411411
// These knobs have contrary functionality.
412-
init( ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE, false ); if( randomize && BUGGIFY ) ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE = deterministicRandom()->coinflip() ? false : true;
412+
init( ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE, false ); if( randomize && BUGGIFY ) ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE = deterministicRandom()->coinflip();
413413
init( ROCKSDB_SINGLEKEY_DELETES_BYTES_LIMIT, 200000 ); // 200KB
414-
init( ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS, true ); if( randomize && BUGGIFY ) ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS = deterministicRandom()->coinflip() ? false : true;
414+
init( ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS, true ); if( randomize && BUGGIFY ) ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS = deterministicRandom()->coinflip();
415+
// ROCKSDB_STATS_LEVEL=1 indicates rocksdb::StatsLevel::kExceptHistogramOrTimers
416+
init( ROCKSDB_STATS_LEVEL, 1 ); if( randomize && BUGGIFY ) ROCKSDB_STATS_LEVEL = deterministicRandom()->randomInt(0, 6);
415417
// Can commit will delay ROCKSDB_CAN_COMMIT_DELAY_ON_OVERLOAD seconds for
416418
// ROCKSDB_CAN_COMMIT_DELAY_TIMES_ON_OVERLOAD times, if rocksdb overloaded.
417419
// Set ROCKSDB_CAN_COMMIT_DELAY_TIMES_ON_OVERLOAD to 0, to disable

fdbclient/ServerKnobs.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ class ServerKnobs : public KnobsImpl<ServerKnobs> {
336336
bool ROCKSDB_SINGLEKEY_DELETES_ON_CLEARRANGE;
337337
int64_t ROCKSDB_SINGLEKEY_DELETES_BYTES_LIMIT;
338338
bool ROCKSDB_ENABLE_CLEAR_RANGE_EAGER_READS;
339+
int ROCKSDB_STATS_LEVEL;
339340
int64_t ROCKSDB_COMPACTION_READAHEAD_SIZE;
340341
int64_t ROCKSDB_BLOCK_SIZE;
341342

fdbserver/KeyValueStoreRocksDB.actor.cpp

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,7 @@ rocksdb::Options getOptions() {
373373
}
374374

375375
options.statistics = rocksdb::CreateDBStatistics();
376-
options.statistics->set_stats_level(rocksdb::kExceptHistogramOrTimers);
376+
options.statistics->set_stats_level(rocksdb::StatsLevel(SERVER_KNOBS->ROCKSDB_STATS_LEVEL));
377377

378378
options.db_log_dir = SERVER_KNOBS->LOG_DIRECTORY;
379379
return options;
@@ -477,10 +477,7 @@ class ReadIteratorPool {
477477
iteratorsMap.insert({ readIteratorIndex, iter });
478478
mutex.unlock();
479479
return iter;
480-
} else if (SERVER_KNOBS->ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS &&
481-
iteratorsMap.size() < SERVER_KNOBS->ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT) {
482-
// Not storing more than ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT of iterators
483-
// to avoid 'out of memory' issues.
480+
} else if (SERVER_KNOBS->ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS) {
484481
// TODO: Based on the datasize in the keyrange, decide whether to store the iterator for reuse.
485482
mutex.lock();
486483
for (it = iteratorsMap.begin(); it != iteratorsMap.end(); it++) {
@@ -497,18 +494,13 @@ class ReadIteratorPool {
497494
mutex.unlock();
498495

499496
ReadIterator iter(cf, readIteratorIndex, db, readRangeOptions, keyRange);
500-
mutex.lock();
501-
iteratorsMap.insert({ readIteratorIndex, iter });
502-
mutex.unlock();
503-
return iter;
504-
} else if (SERVER_KNOBS->ROCKSDB_READ_RANGE_REUSE_BOUNDED_ITERATORS) {
505-
// If the iterator size reaches the ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT.
506-
mutex.lock();
507-
index++;
508-
uint64_t readIteratorIndex = index;
509-
mutex.unlock();
510-
511-
ReadIterator iter(cf, readIteratorIndex, db, readRangeOptions, keyRange);
497+
if (iteratorsMap.size() < SERVER_KNOBS->ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT) {
498+
// Not storing more than ROCKSDB_READ_RANGE_BOUNDED_ITERATORS_MAX_LIMIT of iterators
499+
// to avoid 'out of memory' issues.
500+
mutex.lock();
501+
iteratorsMap.insert({ readIteratorIndex, iter });
502+
mutex.unlock();
503+
}
512504
return iter;
513505
} else {
514506
index++;
@@ -899,14 +891,19 @@ ACTOR Future<Void> rocksDBMetricLogger(UID id,
899891
{ "CountIterSkippedKeys", rocksdb::NUMBER_ITER_SKIP, 0 },
900892
};
901893

894+
// To control the rocksdb::StatsLevel, use ROCKSDB_STATS_LEVEL knob.
902895
state std::vector<std::pair<const char*, uint32_t>> histogramStats = {
903-
{ "CompactionTime", rocksdb::COMPACTION_TIME },
904-
{ "CompactionCPUTime", rocksdb::COMPACTION_CPU_TIME },
905-
{ "CompressionTimeNanos", rocksdb::COMPRESSION_TIMES_NANOS },
906-
{ "DecompressionTimeNanos", rocksdb::DECOMPRESSION_TIMES_NANOS },
907-
{ "HardRateLimitDelayCount", rocksdb::HARD_RATE_LIMIT_DELAY_COUNT },
908-
{ "SoftRateLimitDelayCount", rocksdb::SOFT_RATE_LIMIT_DELAY_COUNT },
909-
{ "WriteStall", rocksdb::WRITE_STALL },
896+
{ "CompactionTime", rocksdb::COMPACTION_TIME }, // enabled if rocksdb::StatsLevel > kExceptTimers(2)
897+
{ "CompactionCPUTime", rocksdb::COMPACTION_CPU_TIME }, // enabled if rocksdb::StatsLevel > kExceptTimers(2)
898+
{ "CompressionTimeNanos",
899+
rocksdb::COMPRESSION_TIMES_NANOS }, // enabled if rocksdb::StatsLevel > kExceptDetailedTimers(3)
900+
{ "DecompressionTimeNanos",
901+
rocksdb::DECOMPRESSION_TIMES_NANOS }, // enabled if rocksdb::StatsLevel > kExceptDetailedTimers(3)
902+
{ "HardRateLimitDelayCount",
903+
rocksdb::HARD_RATE_LIMIT_DELAY_COUNT }, // enabled if rocksdb::StatsLevel > kExceptHistogramOrTimers(1)
904+
{ "SoftRateLimitDelayCount",
905+
rocksdb::SOFT_RATE_LIMIT_DELAY_COUNT }, // enabled if rocksdb::StatsLevel > kExceptHistogramOrTimers(1)
906+
{ "WriteStall", rocksdb::WRITE_STALL }, // enabled if rocksdb::StatsLevel > kExceptHistogramOrTimers(1)
910907
};
911908
state std::vector<std::pair<const char*, std::string>> intPropertyStats = {
912909
{ "NumImmutableMemtables", rocksdb::DB::Properties::kNumImmutableMemTable },
@@ -959,11 +956,14 @@ ACTOR Future<Void> rocksDBMetricLogger(UID id,
959956
cum = stat;
960957
}
961958

962-
for (auto& [name, histogram] : histogramStats) {
963-
rocksdb::HistogramData histogram_data;
964-
statistics->histogramData(histogram, &histogram_data);
965-
e.detail(format("%s%d", name, "P95"), histogram_data.percentile95);
966-
e.detail(format("%s%d", name, "P99"), histogram_data.percentile99);
959+
// None of the histogramStats are enabled unless the ROCKSDB_STATS_LEVEL > kExceptHistogramOrTimers(1)
960+
if (SERVER_KNOBS->ROCKSDB_STATS_LEVEL > rocksdb::kExceptHistogramOrTimers) {
961+
for (auto& [name, histogram] : histogramStats) {
962+
rocksdb::HistogramData histogram_data;
963+
statistics->histogramData(histogram, &histogram_data);
964+
e.detail(format("%s%s", name, "P95"), histogram_data.percentile95);
965+
e.detail(format("%s%s", name, "P99"), histogram_data.percentile99);
966+
}
967967
}
968968

969969
for (const auto& [name, property] : intPropertyStats) {

0 commit comments

Comments
 (0)