Skip to content

Commit bb449dd

Browse files
committed
add tcmalloc metrics
1 parent 657ff8d commit bb449dd

File tree

4 files changed

+57
-0
lines changed

4 files changed

+57
-0
lines changed

src/yb/tserver/tablet_server.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -487,6 +487,8 @@ Status TabletServer::Init() {
487487

488488
RETURN_NOT_OK(DbServerBase::Init());
489489

490+
MemTracker::InitializeGcMetrics(metric_entity());
491+
490492
RETURN_NOT_OK(path_handlers_->Register(web_server_.get()));
491493

492494
log_prefix_ = Format("P $0: ", permanent_uuid());

src/yb/util/mem_tracker.cc

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,22 @@ DEFINE_RUNTIME_int64(mem_tracker_tcmalloc_gc_release_bytes, -1,
119119

120120
DECLARE_int64(server_tcmalloc_max_total_thread_cache_bytes);
121121

122+
METRIC_DEFINE_counter(server, mem_tracker_gc_tcmalloc_calls,
123+
"MemTracker GC TCMalloc Calls",
124+
yb::MetricUnit::kOperations,
125+
"Number of times MemTracker::GcTcmallocIfNeeded() has been called");
126+
127+
METRIC_DEFINE_counter(server, mem_tracker_gc_tcmalloc_bytes_released,
128+
"MemTracker GC TCMalloc Bytes Released",
129+
yb::MetricUnit::kBytes,
130+
"Total number of bytes released by MemTracker::GcTcmallocIfNeeded()");
131+
132+
METRIC_DEFINE_histogram(server, mem_tracker_gc_tcmalloc_bytes_per_call,
133+
"MemTracker GC TCMalloc Bytes Per Call",
134+
yb::MetricUnit::kBytes,
135+
"Histogram of bytes released per call to MemTracker::GcTcmallocIfNeeded()",
136+
60000000 /* 60MB as max value */, 2 /* 2 digits precision */);
137+
122138
namespace yb {
123139

124140
// NOTE: this class has been adapted from Impala, so the code style varies
@@ -739,6 +755,10 @@ bool MemTracker::GcMemory(int64_t max_consumption) {
739755

740756
void MemTracker::GcTcmallocIfNeeded() {
741757
#ifdef YB_TCMALLOC_ENABLED
758+
if (gc_tcmalloc_calls_metric_) {
759+
gc_tcmalloc_calls_metric_->Increment();
760+
}
761+
742762
released_memory_since_gc = 0;
743763
TRACE_EVENT0("process", "MemTracker::GcTcmallocIfNeeded");
744764

@@ -748,7 +768,9 @@ void MemTracker::GcTcmallocIfNeeded() {
748768
// Bytes allocated by the application.
749769
int64_t bytes_used = GetTCMallocCurrentAllocatedBytes();
750770

771+
int64_t initial_overhead = bytes_overhead;
751772
int64_t max_overhead = bytes_used * FLAGS_tcmalloc_max_free_bytes_percentage / 100.0;
773+
752774
if (bytes_overhead > max_overhead) {
753775
int64_t extra = bytes_overhead - max_overhead;
754776
while (extra > 0) {
@@ -762,6 +784,19 @@ void MemTracker::GcTcmallocIfNeeded() {
762784
#endif // YB_GOOGLE_TCMALLOC
763785
extra -= 1024 * 1024;
764786
}
787+
788+
int64_t final_overhead = GetTCMallocPageHeapFreeBytes();
789+
int64_t bytes_released = initial_overhead - final_overhead;
790+
if (gc_tcmalloc_bytes_released_metric_ && bytes_released > 0) {
791+
gc_tcmalloc_bytes_released_metric_->IncrementBy(bytes_released);
792+
}
793+
if (gc_tcmalloc_bytes_per_call_metric_ && bytes_released > 0) {
794+
gc_tcmalloc_bytes_per_call_metric_->Increment(bytes_released);
795+
}
796+
} else {
797+
if (gc_tcmalloc_bytes_per_call_metric_) {
798+
gc_tcmalloc_bytes_per_call_metric_->Increment(0);
799+
}
765800
}
766801
#endif // YB_TCMALLOC_ENABLED
767802
}
@@ -848,6 +883,16 @@ void MemTracker::TEST_SetReleasedMemorySinceGC(int64_t value) {
848883
released_memory_since_gc = value;
849884
}
850885

886+
scoped_refptr<Counter> MemTracker::gc_tcmalloc_calls_metric_;
887+
scoped_refptr<Counter> MemTracker::gc_tcmalloc_bytes_released_metric_;
888+
scoped_refptr<Histogram> MemTracker::gc_tcmalloc_bytes_per_call_metric_;
889+
890+
void MemTracker::InitializeGcMetrics(const scoped_refptr<MetricEntity>& metric_entity) {
891+
gc_tcmalloc_calls_metric_ = METRIC_mem_tracker_gc_tcmalloc_calls.Instantiate(metric_entity);
892+
gc_tcmalloc_bytes_released_metric_ = METRIC_mem_tracker_gc_tcmalloc_bytes_released.Instantiate(metric_entity);
893+
gc_tcmalloc_bytes_per_call_metric_ = METRIC_mem_tracker_gc_tcmalloc_bytes_per_call.Instantiate(metric_entity);
894+
}
895+
851896
scoped_refptr<MetricEntity> MemTracker::metric_entity() const {
852897
return metrics_ ? metrics_->metric_entity_ : nullptr;
853898
}

src/yb/util/mem_tracker.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ namespace yb {
5555

5656
class MemTracker;
5757
class MetricEntity;
58+
class Counter;
59+
class Histogram;
5860
using MemTrackerPtr = std::shared_ptr<MemTracker>;
5961

6062
static const std::string kTCMallocTrackerNamePrefix = "TCMalloc ";
@@ -430,11 +432,17 @@ class MemTracker : public std::enable_shared_from_this<MemTracker> {
430432
// This is needed in some tests to create deterministic GC behavior.
431433
static void TEST_SetReleasedMemorySinceGC(int64_t bytes);
432434

435+
static void InitializeGcMetrics(const scoped_refptr<MetricEntity>& metric_entity);
436+
433437
bool IsRoot() {
434438
return is_root_tracker_;
435439
}
436440

437441
private:
442+
static scoped_refptr<Counter> gc_tcmalloc_calls_metric_;
443+
static scoped_refptr<Counter> gc_tcmalloc_bytes_released_metric_;
444+
static scoped_refptr<Histogram> gc_tcmalloc_bytes_per_call_metric_;
445+
438446
template<class GC>
439447
using GarbageCollectorsContainer = boost::container::small_vector<GC, 8>;
440448

src/yb/yql/pggate/pggate.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -674,6 +674,8 @@ PgApiImpl::PgApiImpl(
674674
ybctid_reader_provider_(pg_session_),
675675
fk_reference_cache_(ybctid_reader_provider_, buffering_settings_, tablespace_map_),
676676
explicit_row_lock_buffer_(ybctid_reader_provider_, tablespace_map_) {
677+
MemTracker::InitializeGcMetrics(metric_entity_);
678+
677679
PgBackendSetupSharedMemory();
678680
// This is an RCU object, but there are no concurrent updates on PG side, only on tserver, so
679681
// it's safe to just save the pointer.

0 commit comments

Comments
 (0)