@@ -119,6 +119,22 @@ DEFINE_RUNTIME_int64(mem_tracker_tcmalloc_gc_release_bytes, -1,
119119
120120DECLARE_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+
122138namespace 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
740756void 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+
851896scoped_refptr<MetricEntity> MemTracker::metric_entity () const {
852897 return metrics_ ? metrics_->metric_entity_ : nullptr ;
853898}
0 commit comments