Add a new stats level to exclude tickers (#7329)
Summary: Currently, application may pass a statistics object to db but later wants to reduce stats tracking overhead by setting stats level to kExceptHistogramOrTimers (the current lowest level). Tickers will still be incremented, causing up to 1% CPU. We can add a new lowest stats level `kExceptTickers` to disable ticker incrementing as well, thus reducing CPU cycles spent on tickers. Test Plan (devserver): ``` make check make clean DEBUG_LEVEL=0 make db_bench ./db_bench -perf_level=1 -stats_level=0 -statistics -benchmarks=fillseq,readrandom -duration=120 ``` Measure CPU util (%) before and after change: CPU util by rocksdb::RecordTick: 1.1 vs (<0.1) Pull Request resolved: https://github.com/facebook/rocksdb/pull/7329 Reviewed By: pdillinger Differential Revision: D23434014 Pulled By: riversand963 fbshipit-source-id: 72ff0f02a192ac476d4b0044b9f37fd4a22ff0d4
This commit is contained in:
parent
27aa443a15
commit
ab202e8d72
@ -142,6 +142,19 @@ TEST_F(DBStatisticsTest, ResetStats) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(DBStatisticsTest, ExcludeTickers) {
|
||||||
|
Options options = CurrentOptions();
|
||||||
|
options.statistics = ROCKSDB_NAMESPACE::CreateDBStatistics();
|
||||||
|
DestroyAndReopen(options);
|
||||||
|
options.statistics->set_stats_level(StatsLevel::kExceptTickers);
|
||||||
|
ASSERT_OK(Put("foo", "value"));
|
||||||
|
ASSERT_EQ(0, options.statistics->getTickerCount(BYTES_WRITTEN));
|
||||||
|
options.statistics->set_stats_level(StatsLevel::kExceptHistogramOrTimers);
|
||||||
|
Reopen(options);
|
||||||
|
ASSERT_EQ("value", Get("foo"));
|
||||||
|
ASSERT_GT(options.statistics->getTickerCount(BYTES_READ), 0);
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace ROCKSDB_NAMESPACE
|
} // namespace ROCKSDB_NAMESPACE
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
|
@ -488,6 +488,10 @@ struct HistogramData {
|
|||||||
// Usage:
|
// Usage:
|
||||||
// options.statistics->set_stats_level(StatsLevel::kExceptTimeForMutex);
|
// options.statistics->set_stats_level(StatsLevel::kExceptTimeForMutex);
|
||||||
enum StatsLevel : uint8_t {
|
enum StatsLevel : uint8_t {
|
||||||
|
// Disable all metrics
|
||||||
|
kDisableAll,
|
||||||
|
// Disable tickers
|
||||||
|
kExceptTickers = kDisableAll,
|
||||||
// Disable timer stats, and skip histogram stats
|
// Disable timer stats, and skip histogram stats
|
||||||
kExceptHistogramOrTimers,
|
kExceptHistogramOrTimers,
|
||||||
// Skip timer stats
|
// Skip timer stats
|
||||||
|
@ -329,11 +329,17 @@ uint64_t StatisticsImpl::getAndResetTickerCount(uint32_t tickerType) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void StatisticsImpl::recordTick(uint32_t tickerType, uint64_t count) {
|
void StatisticsImpl::recordTick(uint32_t tickerType, uint64_t count) {
|
||||||
assert(tickerType < TICKER_ENUM_MAX);
|
if (get_stats_level() <= StatsLevel::kExceptTickers) {
|
||||||
per_core_stats_.Access()->tickers_[tickerType].fetch_add(
|
return;
|
||||||
count, std::memory_order_relaxed);
|
}
|
||||||
if (stats_ && tickerType < TICKER_ENUM_MAX) {
|
if (tickerType < TICKER_ENUM_MAX) {
|
||||||
stats_->recordTick(tickerType, count);
|
per_core_stats_.Access()->tickers_[tickerType].fetch_add(
|
||||||
|
count, std::memory_order_relaxed);
|
||||||
|
if (stats_) {
|
||||||
|
stats_->recordTick(tickerType, count);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
assert(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user