diff --git a/tcmalloc/experiment_config.h b/tcmalloc/experiment_config.h index 176829718..f2556e586 100644 --- a/tcmalloc/experiment_config.h +++ b/tcmalloc/experiment_config.h @@ -23,6 +23,7 @@ namespace tcmalloc { enum class Experiment : int { // clang-format off // go/keep-sorted start + TCMALLOC_DEMAND_CYCLE_120S, // TODO: b/540987155 - Complete experiment. TCMALLOC_HUGE_REGION_ADAPTIVE_RELEASE, // TODO: b/535197873 - Complete experiment. TCMALLOC_PER_CPU_CACHE_SIZE_1MB, // TODO: b/514747820 - Complete experiment. TCMALLOC_PGHO_EXPERIMENT, // TODO: b/460486507 - Complete experiment. @@ -53,6 +54,7 @@ struct ExperimentConfig { // clang-format off inline constexpr ExperimentConfig experiments[] = { // go/keep-sorted start + {Experiment::TCMALLOC_DEMAND_CYCLE_120S, "TCMALLOC_DEMAND_CYCLE_120S"}, {Experiment::TCMALLOC_HUGE_REGION_ADAPTIVE_RELEASE, "TCMALLOC_HUGE_REGION_ADAPTIVE_RELEASE"}, {Experiment::TCMALLOC_PER_CPU_CACHE_SIZE_1MB, "TCMALLOC_PER_CPU_CACHE_SIZE_1MB"}, {Experiment::TCMALLOC_PGHO_EXPERIMENT, "TCMALLOC_PGHO_EXPERIMENT"}, diff --git a/tcmalloc/parameters.cc b/tcmalloc/parameters.cc index bc5e55055..b1c0113ce 100644 --- a/tcmalloc/parameters.cc +++ b/tcmalloc/parameters.cc @@ -109,7 +109,11 @@ static std::atomic& skip_subrelease_short_interval_ns() { #if defined(TCMALLOC_INTERNAL_SMALL_BUT_SLOW) interval = absl::ZeroDuration(); #else - interval = absl::Seconds(10); + if (IsExperimentActive(Experiment::TCMALLOC_DEMAND_CYCLE_120S)) { + interval = absl::Seconds(60); + } else { + interval = absl::Seconds(10); + } #endif absl::base_internal::LowLevelCallOnce(&flag, [&]() { @@ -127,7 +131,11 @@ static std::atomic& skip_subrelease_long_interval_ns() { #if defined(TCMALLOC_INTERNAL_SMALL_BUT_SLOW) interval = absl::ZeroDuration(); #else - interval = absl::Seconds(120); + if (IsExperimentActive(Experiment::TCMALLOC_DEMAND_CYCLE_120S)) { + interval = absl::Seconds(300); + } else { + interval = absl::Seconds(120); + } #endif absl::base_internal::LowLevelCallOnce(&flag, [&]() { @@ -167,10 +175,13 @@ SubreleaseUnbackedMode Parameters::subrelease_unbacked_hugepages() { } std::atomic& background_release_rate_ptr() { + ABSL_CONST_INIT static absl::once_flag flag; ABSL_CONST_INIT static std::atomic v{ MallocExtension::BytesPerSecond{ 0 }}; + absl::base_internal::LowLevelCallOnce(&flag, [&]() { + }); return v; } diff --git a/tcmalloc/testing/get_stats_test.cc b/tcmalloc/testing/get_stats_test.cc index 6631a134e..0076fd619 100644 --- a/tcmalloc/testing/get_stats_test.cc +++ b/tcmalloc/testing/get_stats_test.cc @@ -109,12 +109,21 @@ TEST_F(GetStatsTest, Pbtxt) { EXPECT_THAT(buf, HasSubstr("tcmalloc_skip_subrelease_short_interval_ns: 0")); EXPECT_THAT(buf, HasSubstr("tcmalloc_skip_subrelease_long_interval_ns: 0")); #else - EXPECT_THAT( - buf, - HasSubstr("tcmalloc_skip_subrelease_short_interval_ns: 10000000000")); - EXPECT_THAT( - buf, - HasSubstr("tcmalloc_skip_subrelease_long_interval_ns: 120000000000")); + if (IsExperimentActive(Experiment::TCMALLOC_DEMAND_CYCLE_120S)) { + EXPECT_THAT( + buf, + HasSubstr("tcmalloc_skip_subrelease_short_interval_ns: 60000000000")); + EXPECT_THAT( + buf, + HasSubstr("tcmalloc_skip_subrelease_long_interval_ns: 300000000000")); + } else { + EXPECT_THAT( + buf, + HasSubstr("tcmalloc_skip_subrelease_short_interval_ns: 10000000000")); + EXPECT_THAT( + buf, + HasSubstr("tcmalloc_skip_subrelease_long_interval_ns: 120000000000")); + } #endif EXPECT_THAT(buf, HasSubstr("tcmalloc_release_partial_alloc_pages: true"));