You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@doris.apache.org by zo...@apache.org on 2022/12/05 13:16:42 UTC
[doris] branch master updated: [fix](tcmalloc_gc) optimize policy of tcmalloc gc (#14776)
This is an automated email from the ASF dual-hosted git repository.
zouxinyi pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 07472f7318 [fix](tcmalloc_gc) optimize policy of tcmalloc gc (#14776)
07472f7318 is described below
commit 07472f731819745e86da3ba6d4b81aa3f70a83df
Author: Yongqiang YANG <98...@users.noreply.github.com>
AuthorDate: Mon Dec 5 21:16:35 2022 +0800
[fix](tcmalloc_gc) optimize policy of tcmalloc gc (#14776)
Release memory when memory pressure is above pressure limit and keep at lease 2% memory as tcmalloc cache.
---
be/src/common/daemon.cpp | 21 +++++++++++++--------
1 file changed, 13 insertions(+), 8 deletions(-)
diff --git a/be/src/common/daemon.cpp b/be/src/common/daemon.cpp
index 0be20cd377..3687f99fc2 100644
--- a/be/src/common/daemon.cpp
+++ b/be/src/common/daemon.cpp
@@ -80,7 +80,7 @@ void Daemon::tcmalloc_gc_thread() {
double release_rates[10] = {1.0, 1.0, 1.0, 5.0, 5.0, 20.0, 50.0, 100.0, 500.0, 2000.0};
int64_t pressure_limit = 90;
bool is_performance_mode = false;
- size_t physical_limit_bytes =
+ int64_t physical_limit_bytes =
std::min(MemInfo::physical_mem() - MemInfo::sys_mem_available_low_water_mark(),
MemInfo::mem_limit());
@@ -115,13 +115,16 @@ void Daemon::tcmalloc_gc_thread() {
&tc_alloc_bytes);
MallocExtension::instance()->GetNumericProperty("generic.current_allocated_bytes",
&tc_used_bytes);
- int64_t tc_cached_bytes = tc_alloc_bytes - tc_used_bytes;
+ int64_t tc_cached_bytes = (int64_t)tc_alloc_bytes - (int64_t)tc_used_bytes;
int64_t to_free_bytes =
- (int64_t)tc_cached_bytes - (tc_used_bytes * max_cache_percent / 100);
+ (int64_t)tc_cached_bytes - ((int64_t)tc_used_bytes * max_cache_percent / 100);
+ to_free_bytes = std::max(to_free_bytes, (int64_t)0);
int64_t memory_pressure = 0;
+ int64_t rss_pressure = 0;
int64_t alloc_bytes = std::max(rss, tc_alloc_bytes);
memory_pressure = alloc_bytes * 100 / physical_limit_bytes;
+ rss_pressure = rss * 100 / physical_limit_bytes;
expected_aggressive_decommit = init_aggressive_decommit;
if (memory_pressure > pressure_limit) {
@@ -129,11 +132,13 @@ void Daemon::tcmalloc_gc_thread() {
// Ideally, we should reuse cache and not allocate from system any more,
// however, it is hard to set limit on cache of tcmalloc and doris
// use mmap in vectorized mode.
- if (last_memory_pressure <= pressure_limit) {
+ // Limit cache capactiy is enough.
+ if (rss_pressure > pressure_limit) {
int64_t min_free_bytes = alloc_bytes - physical_limit_bytes * 9 / 10;
to_free_bytes = std::max(to_free_bytes, min_free_bytes);
to_free_bytes = std::max(to_free_bytes, tc_cached_bytes * 30 / 100);
- to_free_bytes = std::min(to_free_bytes, tc_cached_bytes);
+ // We assure that we have at least 500M bytes in cache.
+ to_free_bytes = std::min(to_free_bytes, tc_cached_bytes - 500 * 1024 * 1024);
expected_aggressive_decommit = 1;
}
last_ms = kMaxLastMs;
@@ -147,7 +152,7 @@ void Daemon::tcmalloc_gc_thread() {
int release_rate_index = memory_pressure / 10;
double release_rate = 1.0;
- if (release_rate_index >= sizeof(release_rates)) {
+ if (release_rate_index >= sizeof(release_rates) / sizeof(release_rates[0])) {
release_rate = 2000.0;
} else {
release_rate = release_rates[release_rate_index];
@@ -161,7 +166,8 @@ void Daemon::tcmalloc_gc_thread() {
}
last_memory_pressure = memory_pressure;
- if (to_free_bytes > 0) {
+ // We release at least 2% bytes once, frequent releasing hurts performance.
+ if (to_free_bytes > (physical_limit_bytes * 2 / 100)) {
last_ms += kIntervalMs;
if (last_ms >= kMaxLastMs) {
LOG(INFO) << "generic.current_allocated_bytes " << tc_used_bytes
@@ -175,7 +181,6 @@ void Daemon::tcmalloc_gc_thread() {
last_ms = 0;
}
} else {
- DCHECK(tc_cached_bytes <= tc_used_bytes * max_cache_percent / 100);
last_ms = 0;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@doris.apache.org
For additional commands, e-mail: commits-help@doris.apache.org