diff --git a/tcmalloc/global_stats.cc b/tcmalloc/global_stats.cc index f7f8be821..ae03797c6 100644 --- a/tcmalloc/global_stats.cc +++ b/tcmalloc/global_stats.cc @@ -132,6 +132,7 @@ void ExtractStats(TCMallocStats& r, uint64_t* absl_nullable class_count, PageHeapSpinLockHolder l; r.metadata_bytes = tc_globals.metadata_bytes(); r.pagemap_bytes = tc_globals.pagemap().bytes(); + r.pagemap_root_size = tc_globals.pagemap().RootSize(); r.pageheap = tc_globals.page_allocator().stats(); r.peak_stats = tc_globals.page_allocator().peak_stats(); if (small_spans != nullptr) { @@ -367,6 +368,7 @@ void DumpStats(Printer& out, int level) { "MALLOC: %12u (%7.1f MiB) Table buckets created\n" "MALLOC: %12u (%7.1f MiB) Pagemap bytes used\n" "MALLOC: %12u (%7.1f MiB) Pagemap root resident bytes\n" + "MALLOC: %12u (%7.1f MiB) Pagemap root size\n" "MALLOC: %12u (%7.1f MiB) per-CPU slab bytes used\n" "MALLOC: %12u (%7.1f MiB) per-CPU slab resident bytes\n" "MALLOC: %12u (%7.1f MiB) malloc metadata Arena non-resident bytes\n" @@ -405,6 +407,7 @@ void DumpStats(Printer& out, int level) { uint64_t(stats.pagemap_bytes), stats.pagemap_bytes / MiB, stats.pagemap_root_bytes_res, stats.pagemap_root_bytes_res / MiB, + uint64_t(stats.pagemap_root_size), stats.pagemap_root_size / MiB, uint64_t(stats.percpu_metadata_bytes), stats.percpu_metadata_bytes / MiB, stats.percpu_metadata_bytes_res, stats.percpu_metadata_bytes_res / MiB, @@ -765,6 +768,7 @@ void DumpStatsInPbtxt(Printer& out, int level) { uint64_t(stats.linked_sample_stats.total)); region.PrintI64("pagemap_size", uint64_t(stats.pagemap_bytes)); region.PrintI64("pagemap_root_residence", stats.pagemap_root_bytes_res); + region.PrintI64("pagemap_root_size", uint64_t(stats.pagemap_root_size)); region.PrintI64("percpu_slab_size", stats.percpu_metadata_bytes); region.PrintI64("percpu_slab_residence", stats.percpu_metadata_bytes_res); region.PrintI64("peak_backed", stats.peak_stats.backed_bytes); diff --git a/tcmalloc/global_stats.h b/tcmalloc/global_stats.h index 04b2483e3..68265e497 100644 --- a/tcmalloc/global_stats.h +++ b/tcmalloc/global_stats.h @@ -47,6 +47,7 @@ struct TCMallocStats { AllocatorStats stack_stats; // StackTrace objects AllocatorStats linked_sample_stats; // StackTraceTable::LinkedSample objects size_t pagemap_bytes; // included in metadata bytes + size_t pagemap_root_size; // Size of pagemap root node array size_t percpu_metadata_bytes; // included in metadata bytes BackingStats pageheap; // Stats from page heap PageAllocator::PeakStats peak_stats; diff --git a/tcmalloc/pagemap.h b/tcmalloc/pagemap.h index 6519e246e..602d4de34 100644 --- a/tcmalloc/pagemap.h +++ b/tcmalloc/pagemap.h @@ -600,6 +600,8 @@ class PageMap { return map_.bytes_used(); } + constexpr size_t RootSize() const { return map_.RootSize(); } + [[nodiscard]] void* GetHugepage(PageId p) { return map_.get_hugepage(p.index()); } diff --git a/tcmalloc/testing/get_stats_test.cc b/tcmalloc/testing/get_stats_test.cc index 614b2548b..3a3af7e49 100644 --- a/tcmalloc/testing/get_stats_test.cc +++ b/tcmalloc/testing/get_stats_test.cc @@ -79,6 +79,7 @@ TEST_F(GetStatsTest, Pbtxt) { EXPECT_THAT(buf, ContainsRegex(R"(in_use_by_app: [0-9]+)")); EXPECT_THAT(buf, ContainsRegex(R"(page_heap_freelist: [0-9]+)")); EXPECT_THAT(buf, ContainsRegex(R"(tcmalloc_huge_page_size: [0-9]+)")); + EXPECT_THAT(buf, ContainsRegex(R"(pagemap_root_size: [1-9][0-9]*)")); #if defined(GTEST_USES_PCRE) EXPECT_THAT(buf, ContainsRegex(absl::StrCat(