From c0bf905497a07ac5392b29b08abc0d69ae535953 Mon Sep 17 00:00:00 2001 From: Xinyi Zou Date: Tue, 24 Sep 2024 13:56:45 +0800 Subject: [PATCH] [fix](memory) Fix refresh cgroup meminfo (#41123) cgroup memory usage should be refreshed frequently. --- be/src/util/mem_info.cpp | 55 +++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 29 deletions(-) diff --git a/be/src/util/mem_info.cpp b/be/src/util/mem_info.cpp index 8be1db5cb8559c..b820234e712d4c 100644 --- a/be/src/util/mem_info.cpp +++ b/be/src/util/mem_info.cpp @@ -189,40 +189,37 @@ void MemInfo::refresh_proc_meminfo() { } // refresh cgroup memory - if (_s_cgroup_mem_refresh_wait_times >= 0 && config::enable_use_cgroup_memory_info) { - int64_t cgroup_mem_limit = -1; - int64_t cgroup_mem_usage = -1; - std::string cgroup_mem_info_file_path; - _s_cgroup_mem_refresh_state = true; - Status status = CGroupMemoryCtl::find_cgroup_mem_limit(&cgroup_mem_limit); - if (!status.ok()) { - _s_cgroup_mem_refresh_state = false; - } - status = CGroupMemoryCtl::find_cgroup_mem_usage(&cgroup_mem_usage); - if (!status.ok()) { - _s_cgroup_mem_refresh_state = false; - } - - if (_s_cgroup_mem_refresh_state) { - _s_cgroup_mem_limit = cgroup_mem_limit; - _s_cgroup_mem_usage = cgroup_mem_usage; - // wait 10s, 100 * 100ms, avoid too frequently. - _s_cgroup_mem_refresh_wait_times = -100; - LOG(INFO) << "Refresh cgroup memory win, refresh again after 10s, cgroup mem limit: " - << _s_cgroup_mem_limit << ", cgroup mem usage: " << _s_cgroup_mem_usage; + if (config::enable_use_cgroup_memory_info) { + if (_s_cgroup_mem_refresh_wait_times >= 0) { + auto status = CGroupMemoryCtl::find_cgroup_mem_limit(&_s_cgroup_mem_limit); + if (!status.ok()) { + _s_cgroup_mem_limit = std::numeric_limits::max(); + // find cgroup limit failed, wait 300s, 1000 * 100ms. + _s_cgroup_mem_refresh_wait_times = -3000; + LOG(INFO) << "Refresh cgroup memory limit failed, refresh again after 300s, cgroup " + "mem limit: " + << _s_cgroup_mem_limit; + } else { + // wait 10s, 100 * 100ms, avoid too frequently. + _s_cgroup_mem_refresh_wait_times = -100; + } } else { - // find cgroup failed, wait 300s, 1000 * 100ms. - _s_cgroup_mem_refresh_wait_times = -3000; - LOG(INFO) - << "Refresh cgroup memory failed, refresh again after 300s, cgroup mem limit: " - << _s_cgroup_mem_limit << ", cgroup mem usage: " << _s_cgroup_mem_usage; - } - } else { - if (config::enable_use_cgroup_memory_info) { _s_cgroup_mem_refresh_wait_times++; + } + + if (_s_cgroup_mem_limit != std::numeric_limits::max()) { + auto status = CGroupMemoryCtl::find_cgroup_mem_usage(&_s_cgroup_mem_usage); + if (!status.ok()) { + _s_cgroup_mem_usage = std::numeric_limits::min(); + _s_cgroup_mem_refresh_state = false; + } else { + _s_cgroup_mem_refresh_state = true; + } } else { _s_cgroup_mem_refresh_state = false; } + } else { + _s_cgroup_mem_refresh_state = false; } // 1. calculate physical_mem