4e91f27c3a
Summary: For some reason, D15099 caused a big performance regression: https://fburl.com/16059000 After digging a bit, I figured out that the reason was that std::atomic_uint_fast64_t was allocated in an array. When I switched from an array to vector, the QPS returned to the previous level. I'm not sure why this is happening, but this diff seems to fix the performance regression. Test Plan: I ran the regression script, observed the performance going back to normal Reviewers: tnovak, kailiu, haobo Reviewed By: kailiu CC: leveldb Differential Revision: https://reviews.facebook.net/D15375
97 lines
2.7 KiB
C++
97 lines
2.7 KiB
C++
// Copyright (c) 2013, Facebook, Inc. All rights reserved.
|
|
// This source code is licensed under the BSD-style license found in the
|
|
// LICENSE file in the root directory of this source tree. An additional grant
|
|
// of patent rights can be found in the PATENTS file in the same directory.
|
|
//
|
|
#include "util/statistics.h"
|
|
#include "rocksdb/statistics.h"
|
|
#include <algorithm>
|
|
#include <cstdio>
|
|
|
|
namespace rocksdb {
|
|
|
|
std::shared_ptr<Statistics> CreateDBStatistics() {
|
|
return std::make_shared<StatisticsImpl>();
|
|
}
|
|
|
|
StatisticsImpl::StatisticsImpl()
|
|
: tickers_(TICKER_ENUM_MAX),
|
|
histograms_(HISTOGRAM_ENUM_MAX) {}
|
|
|
|
StatisticsImpl::~StatisticsImpl() {}
|
|
|
|
long StatisticsImpl::getTickerCount(Tickers tickerType) {
|
|
assert(tickerType < TICKER_ENUM_MAX);
|
|
return tickers_[tickerType];
|
|
}
|
|
|
|
void StatisticsImpl::setTickerCount(Tickers tickerType, uint64_t count) {
|
|
assert(tickerType < TICKER_ENUM_MAX);
|
|
tickers_[tickerType] = count;
|
|
}
|
|
|
|
void StatisticsImpl::recordTick(Tickers tickerType, uint64_t count) {
|
|
assert(tickerType < TICKER_ENUM_MAX);
|
|
tickers_[tickerType] += count;
|
|
}
|
|
|
|
void StatisticsImpl::measureTime(Histograms histogramType, uint64_t value) {
|
|
assert(histogramType < HISTOGRAM_ENUM_MAX);
|
|
histograms_[histogramType].Add(value);
|
|
}
|
|
|
|
void StatisticsImpl::histogramData(Histograms histogramType,
|
|
HistogramData* const data) {
|
|
assert(histogramType < HISTOGRAM_ENUM_MAX);
|
|
histograms_[histogramType].Data(data);
|
|
}
|
|
|
|
namespace {
|
|
|
|
// a buffer size used for temp string buffers
|
|
const int kBufferSize = 200;
|
|
|
|
std::string HistogramToString (
|
|
Statistics* dbstats,
|
|
const Histograms& histogram_type,
|
|
const std::string& name) {
|
|
|
|
char buffer[kBufferSize];
|
|
HistogramData histogramData;
|
|
dbstats->histogramData(histogram_type, &histogramData);
|
|
snprintf(
|
|
buffer,
|
|
kBufferSize,
|
|
"%s statistics Percentiles :=> 50 : %f 95 : %f 99 : %f\n",
|
|
name.c_str(),
|
|
histogramData.median,
|
|
histogramData.percentile95,
|
|
histogramData.percentile99
|
|
);
|
|
return std::string(buffer);
|
|
};
|
|
|
|
std::string TickerToString(Statistics* dbstats, const Tickers& ticker,
|
|
const std::string& name) {
|
|
char buffer[kBufferSize];
|
|
snprintf(buffer, kBufferSize, "%s COUNT : %ld\n",
|
|
name.c_str(), dbstats->getTickerCount(ticker));
|
|
return std::string(buffer);
|
|
};
|
|
} // namespace
|
|
|
|
std::string Statistics::ToString() {
|
|
std::string res;
|
|
res.reserve(20000);
|
|
for (const auto& t : TickersNameMap) {
|
|
res.append(TickerToString(this, t.first, t.second));
|
|
}
|
|
for (const auto& h : HistogramsNameMap) {
|
|
res.append(HistogramToString(this, h.first, h.second));
|
|
}
|
|
res.shrink_to_fit();
|
|
return res;
|
|
}
|
|
|
|
} // namespace rocksdb
|