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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]