This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch branch-1.1-lts in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/branch-1.1-lts by this push: new 5f73879c2c [branch-1.1-lts](memtracker) Fix mem hook cancel query #13396 5f73879c2c is described below commit 5f73879c2c6188b459e21d019f33e88b857abb0e Author: Xinyi Zou <zouxiny...@gmail.com> AuthorDate: Wed Oct 19 12:34:52 2022 +0800 [branch-1.1-lts](memtracker) Fix mem hook cancel query #13396 Allow independent enable based on proc/mem_info check mem limit and cancel query --- be/src/common/config.h | 5 ++++- be/src/runtime/mem_tracker.h | 2 +- be/src/runtime/memory/mem_tracker_limiter.h | 11 ++++++++--- be/src/runtime/memory/thread_mem_tracker_mgr.cpp | 2 +- be/src/runtime/runtime_state.cpp | 2 +- be/test/runtime/mem_limit_test.cpp | 8 ++++---- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/be/src/common/config.h b/be/src/common/config.h index dfba339af5..132d7b43fd 100644 --- a/be/src/common/config.h +++ b/be/src/common/config.h @@ -632,7 +632,10 @@ CONF_Int16(mem_tracker_level, "0"); // Whether Hook TCmalloc new/delete, currently consume/release tls mem tracker in Hook. CONF_Bool(enable_tcmalloc_hook, "true"); -CONF_Bool(enable_cancel_query, "false"); +// Cancel query if the process physical memory recorded in `/proc/mem_info` exceeds the limit. +CONF_Bool(enable_proc_meminfo_cancel_query, "false"); +// Cancel query if query mem tracker exceeds the limit. +CONF_Bool(enable_mem_tracker_cancel_query, "false"); // If true, switch TLS MemTracker to count more detailed memory, // including caches such as ExecNode operators and TabletManager. diff --git a/be/src/runtime/mem_tracker.h b/be/src/runtime/mem_tracker.h index e7a14c1ac7..d3808cdddb 100644 --- a/be/src/runtime/mem_tracker.h +++ b/be/src/runtime/mem_tracker.h @@ -173,7 +173,7 @@ public: // This is independent of the consumption value of the mem tracker, which counts the virtual memory // of the process malloc. // for fast, expect MemInfo::initialized() to be true. - if (PerfCounters::get_vm_rss() + bytes >= MemInfo::mem_limit() && config::enable_cancel_query) { + if (PerfCounters::get_vm_rss() + bytes >= MemInfo::mem_limit()) { return Status::MemoryLimitExceeded(fmt::format( "{}: TryConsume failed, bytes={} process whole consumption={} mem limit={}", label_, bytes, MemInfo::current_mem(), MemInfo::mem_limit())); diff --git a/be/src/runtime/memory/mem_tracker_limiter.h b/be/src/runtime/memory/mem_tracker_limiter.h index df3d271494..001493bc80 100644 --- a/be/src/runtime/memory/mem_tracker_limiter.h +++ b/be/src/runtime/memory/mem_tracker_limiter.h @@ -80,7 +80,11 @@ public: bytes >= MemInfo::mem_limit() || PerfCounters::get_vm_rss() + bytes >= MemInfo::hard_mem_limit()) { - return true; + if (config::enable_proc_meminfo_cancel_query) { + return true; + } else { + ExecEnv::GetInstance()->new_process_mem_tracker()->print_log_usage("sys_mem_exceed_limit_check"); + } } return false; } @@ -306,7 +310,7 @@ inline bool MemTrackerLimiter::try_consume(int64_t bytes, std::string& failed_ms MemTrackerLimiter* tracker = _all_ancestors[i]; // Process tracker does not participate in the process memory limit, process tracker consumption is virtual memory, // and there is a diff between the real physical memory value of the process. It is replaced by check_sys_mem_info. - if (tracker->limit() < 0 || tracker->label() == "Process") { + if (tracker->limit() < 0 || !config::enable_mem_tracker_cancel_query || tracker->label() == "Process") { tracker->_consumption->add(bytes); // No limit at this tracker. } else { if (!tracker->_consumption->try_add(bytes, tracker->limit())) { @@ -326,10 +330,11 @@ inline bool MemTrackerLimiter::try_consume(int64_t bytes, std::string& failed_ms } inline Status MemTrackerLimiter::check_limit(int64_t bytes) { - if (bytes <= 0 || !config::enable_cancel_query) return Status::OK(); + if (bytes <= 0) return Status::OK(); if (sys_mem_exceed_limit_check(bytes)) { return Status::MemoryLimitExceeded(limit_exceeded_errmsg_sys_str(bytes)); } + if (!config::enable_mem_tracker_cancel_query) return Status::OK(); int i; // Walk the tracker tree top-down. for (i = _limited_ancestors.size() - 1; i >= 0; --i) { diff --git a/be/src/runtime/memory/thread_mem_tracker_mgr.cpp b/be/src/runtime/memory/thread_mem_tracker_mgr.cpp index 7811fddeaa..3cb97c6ff8 100644 --- a/be/src/runtime/memory/thread_mem_tracker_mgr.cpp +++ b/be/src/runtime/memory/thread_mem_tracker_mgr.cpp @@ -45,7 +45,7 @@ void ThreadMemTrackerMgr::detach_limiter_tracker() { } void ThreadMemTrackerMgr::exceeded_cancel_task(const std::string& cancel_details) { - if (_fragment_instance_id_stack.back() != TUniqueId() && config::enable_cancel_query) { + if (_fragment_instance_id_stack.back() != TUniqueId()) { ExecEnv::GetInstance()->fragment_mgr()->cancel( _fragment_instance_id_stack.back(), PPlanFragmentCancelReason::MEMORY_LIMIT_EXCEED, cancel_details); diff --git a/be/src/runtime/runtime_state.cpp b/be/src/runtime/runtime_state.cpp index 864564e18b..fb3130e9d6 100644 --- a/be/src/runtime/runtime_state.cpp +++ b/be/src/runtime/runtime_state.cpp @@ -322,7 +322,7 @@ Status RuntimeState::set_mem_limit_exceeded(const std::string& msg) { Status RuntimeState::check_query_state(const std::string& msg) { // TODO: it would be nice if this also checked for cancellation, but doing so breaks // cases where we use Status::Cancelled("Cancelled") to indicate that the limit was reached. - if (config::enable_cancel_query) RETURN_IF_LIMIT_EXCEEDED(this, msg); + if (config::enable_mem_tracker_cancel_query) RETURN_IF_LIMIT_EXCEEDED(this, msg); return query_status(); } diff --git a/be/test/runtime/mem_limit_test.cpp b/be/test/runtime/mem_limit_test.cpp index cc03e0b84f..903d112454 100644 --- a/be/test/runtime/mem_limit_test.cpp +++ b/be/test/runtime/mem_limit_test.cpp @@ -24,7 +24,7 @@ namespace doris { TEST(MemTrackerTest, SingleTrackerNoLimit) { - config::enable_cancel_query = true; + config::enable_mem_tracker_cancel_query = true; auto t = MemTracker::CreateTracker(); EXPECT_FALSE(t->has_limit()); t->Consume(10); @@ -38,7 +38,7 @@ TEST(MemTrackerTest, SingleTrackerNoLimit) { } TEST(MemTestTest, SingleTrackerWithLimit) { - config::enable_cancel_query = true; + config::enable_mem_tracker_cancel_query = true; auto t = MemTracker::CreateTracker(11, "limit tracker"); EXPECT_TRUE(t->has_limit()); t->Consume(10); @@ -54,7 +54,7 @@ TEST(MemTestTest, SingleTrackerWithLimit) { } TEST(MemTestTest, TrackerHierarchy) { - config::enable_cancel_query = true; + config::enable_mem_tracker_cancel_query = true; auto p = MemTracker::CreateTracker(100); auto c1 = MemTracker::CreateTracker(80, "c1", p); auto c2 = MemTracker::CreateTracker(50, "c2", p); @@ -98,7 +98,7 @@ TEST(MemTestTest, TrackerHierarchy) { } TEST(MemTestTest, TrackerHierarchyTryConsume) { - config::enable_cancel_query = true; + config::enable_mem_tracker_cancel_query = true; auto p = MemTracker::CreateTracker(100); auto c1 = MemTracker::CreateTracker(80, "c1", p); auto c2 = MemTracker::CreateTracker(50, "c2", p); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org