This is an automated email from the ASF dual-hosted git repository.

morningman pushed a commit to branch branch-2.1
in repository https://gitbox.apache.org/repos/asf/doris.git


The following commit(s) were added to refs/heads/branch-2.1 by this push:
     new 9d7c65b4d81 [fix](memory) Avoid frequently refresh cgroup memory info 
(#35083) (#35182)
9d7c65b4d81 is described below

commit 9d7c65b4d8120c9170fd5c8342a6844da4fd169f
Author: Xinyi Zou <zouxiny...@gmail.com>
AuthorDate: Wed May 22 11:42:08 2024 +0800

    [fix](memory) Avoid frequently refresh cgroup memory info (#35083) (#35182)
    
    pick #35083
---
 be/src/util/mem_info.cpp | 23 +++++++++++++++++++----
 be/src/util/mem_info.h   |  2 ++
 2 files changed, 21 insertions(+), 4 deletions(-)

diff --git a/be/src/util/mem_info.cpp b/be/src/util/mem_info.cpp
index a2cb04049db..f01524bb7ea 100644
--- a/be/src/util/mem_info.cpp
+++ b/be/src/util/mem_info.cpp
@@ -59,6 +59,8 @@ bvar::PassiveStatus<int64_t> g_sys_mem_avail(
 
 bool MemInfo::_s_initialized = false;
 std::atomic<int64_t> MemInfo::_s_physical_mem = 
std::numeric_limits<int64_t>::max();
+int64_t MemInfo::_s_cgroup_mem_limit = std::numeric_limits<int64_t>::max();
+int64_t MemInfo::_s_cgroup_mem_limit_refresh_wait_times = 0;
 std::atomic<int64_t> MemInfo::_s_mem_limit = 
std::numeric_limits<int64_t>::max();
 std::atomic<int64_t> MemInfo::_s_soft_mem_limit = 
std::numeric_limits<int64_t>::max();
 
@@ -395,10 +397,23 @@ void MemInfo::refresh_proc_meminfo() {
     int64_t physical_mem = -1;
     int64_t cgroup_mem_limit = -1;
     physical_mem = _mem_info_bytes["MemTotal"];
-    Status status = CGroupUtil::find_cgroup_mem_limit(&cgroup_mem_limit);
-    if (status.ok() && cgroup_mem_limit > 0) {
+    if (_s_cgroup_mem_limit_refresh_wait_times >= 0) {
+        Status status = CGroupUtil::find_cgroup_mem_limit(&cgroup_mem_limit);
+        if (status.ok() && cgroup_mem_limit > 0) {
+            _s_cgroup_mem_limit = cgroup_mem_limit;
+            _s_cgroup_mem_limit_refresh_wait_times =
+                    -1000; // wait 10s, 1000 * 100ms, avoid too frequently.
+        } else {
+            _s_cgroup_mem_limit = std::numeric_limits<int64_t>::max();
+            _s_cgroup_mem_limit_refresh_wait_times =
+                    -6000; // find cgroup failed, wait 60s, 6000 * 100ms.
+        }
+    } else {
+        _s_cgroup_mem_limit_refresh_wait_times++;
+    }
+    if (_s_cgroup_mem_limit > 0) {
         // In theory, always cgroup_mem_limit < physical_mem
-        physical_mem = std::min(physical_mem, cgroup_mem_limit);
+        physical_mem = std::min(physical_mem, _s_cgroup_mem_limit);
     }
 
     if (physical_mem <= 0) {
@@ -438,7 +453,7 @@ void MemInfo::refresh_proc_meminfo() {
     if (_mem_info_bytes.find("MemAvailable") != _mem_info_bytes.end()) {
         mem_available = _mem_info_bytes["MemAvailable"];
     }
-    status = CGroupUtil::find_cgroup_mem_usage(&cgroup_mem_usage);
+    auto status = CGroupUtil::find_cgroup_mem_usage(&cgroup_mem_usage);
     if (status.ok() && cgroup_mem_usage > 0 && cgroup_mem_limit > 0) {
         if (mem_available < 0) {
             mem_available = cgroup_mem_limit - cgroup_mem_usage;
diff --git a/be/src/util/mem_info.h b/be/src/util/mem_info.h
index 5606ebd45d6..59030130e01 100644
--- a/be/src/util/mem_info.h
+++ b/be/src/util/mem_info.h
@@ -197,6 +197,8 @@ public:
 private:
     static bool _s_initialized;
     static std::atomic<int64_t> _s_physical_mem;
+    static int64_t _s_cgroup_mem_limit;
+    static int64_t _s_cgroup_mem_limit_refresh_wait_times;
     static std::atomic<int64_t> _s_mem_limit;
     static std::atomic<int64_t> _s_soft_mem_limit;
 


---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org
For additional commands, e-mail: commits-h...@doris.apache.org

Reply via email to