diff --git a/be/src/runtime/memory/mem_tracker.cpp b/be/src/runtime/memory/mem_tracker.cpp index 7ec943090d0441..6a7994ee7cc65d 100644 --- a/be/src/runtime/memory/mem_tracker.cpp +++ b/be/src/runtime/memory/mem_tracker.cpp @@ -24,22 +24,16 @@ #include -#include "common/daemon.h" #include "runtime/memory/mem_tracker_limiter.h" #include "runtime/thread_context.h" namespace doris { -struct TrackerGroup { - std::list trackers; - std::mutex group_lock; -}; - // Save all MemTrackers in use to maintain the weak relationship between MemTracker and MemTrackerLimiter. // When MemTrackerLimiter prints statistics, all MemTracker statistics with weak relationship will be printed together. // Each group corresponds to several MemTrackerLimiters and has a lock. // Multiple groups are used to reduce the impact of locks. -static std::vector mem_tracker_pool(1000); +std::vector MemTracker::mem_tracker_pool(1000); MemTracker::MemTracker(const std::string& label, RuntimeProfile* profile, MemTrackerLimiter* parent, const std::string& profile_counter_name) @@ -82,7 +76,7 @@ void MemTracker::bind_parent(MemTrackerLimiter* parent) { } MemTracker::~MemTracker() { - if (_parent_group_num != -1 && !k_doris_exit) { + if (_parent_group_num != -1) { std::lock_guard l(mem_tracker_pool[_parent_group_num].group_lock); if (_tracker_group_it != mem_tracker_pool[_parent_group_num].trackers.end()) { mem_tracker_pool[_parent_group_num].trackers.erase(_tracker_group_it); diff --git a/be/src/runtime/memory/mem_tracker.h b/be/src/runtime/memory/mem_tracker.h index c21ef478e03ae8..b83502c6c64619 100644 --- a/be/src/runtime/memory/mem_tracker.h +++ b/be/src/runtime/memory/mem_tracker.h @@ -57,6 +57,11 @@ class MemTracker { int64_t peak_consumption = 0; }; + struct TrackerGroup { + std::list trackers; + std::mutex group_lock; + }; + // A counter that keeps track of the current and peak value seen. // Relaxed ordering, not accurate in real time. class MemCounter { @@ -182,6 +187,8 @@ class MemTracker { // Use _parent_label to correlate with parent limiter tracker. std::string _parent_label = "-"; + static std::vector mem_tracker_pool; + // Iterator into mem_tracker_pool for this object. Stored to have O(1) remove. std::list::iterator _tracker_group_it; }; diff --git a/be/src/runtime/memory/mem_tracker_limiter.cpp b/be/src/runtime/memory/mem_tracker_limiter.cpp index e44da881eb0394..517589f7671a10 100644 --- a/be/src/runtime/memory/mem_tracker_limiter.cpp +++ b/be/src/runtime/memory/mem_tracker_limiter.cpp @@ -26,7 +26,6 @@ #include #include -#include "common/daemon.h" #include "runtime/exec_env.h" #include "runtime/fragment_mgr.h" #include "runtime/load_channel_mgr.h" @@ -42,7 +41,8 @@ namespace doris { // Save all MemTrackerLimiters in use. // Each group corresponds to several MemTrackerLimiters and has a lock. // Multiple groups are used to reduce the impact of locks. -static std::vector mem_tracker_limiter_pool(MEM_TRACKER_GROUP_NUM); +std::vector MemTrackerLimiter::mem_tracker_limiter_pool( + MEM_TRACKER_GROUP_NUM); std::atomic MemTrackerLimiter::_enable_print_log_process_usage {true}; @@ -91,7 +91,7 @@ MemTrackerLimiter::~MemTrackerLimiter() { // in real time. Merge its consumption into orphan when parent is process, to avoid repetition. ExecEnv::GetInstance()->orphan_mem_tracker()->consume(_consumption->current_value()); _consumption->set(0); - if (!k_doris_exit) { + { std::lock_guard l(mem_tracker_limiter_pool[_group_num].group_lock); if (_tracker_limiter_group_it != mem_tracker_limiter_pool[_group_num].trackers.end()) { mem_tracker_limiter_pool[_group_num].trackers.erase(_tracker_limiter_group_it); diff --git a/be/src/runtime/memory/mem_tracker_limiter.h b/be/src/runtime/memory/mem_tracker_limiter.h index c90845ae88d8b1..218f9e166de3fa 100644 --- a/be/src/runtime/memory/mem_tracker_limiter.h +++ b/be/src/runtime/memory/mem_tracker_limiter.h @@ -50,13 +50,6 @@ class TaskGroup; using TaskGroupPtr = std::shared_ptr; } // namespace taskgroup -class MemTrackerLimiter; - -struct TrackerLimiterGroup { - std::list trackers; - std::mutex group_lock; -}; - // Track and limit the memory usage of process and query. // Contains an limit, arranged into a tree structure. // @@ -76,6 +69,11 @@ class MemTrackerLimiter final : public MemTracker { 6 // Experimental memory statistics, usually inaccurate, used for debugging, and expect to add other types in the future. }; + struct TrackerLimiterGroup { + std::list trackers; + std::mutex group_lock; + }; + inline static std::unordered_map> TypeMemSum = {{Type::GLOBAL, std::make_shared(TUnit::BYTES)}, @@ -272,6 +270,8 @@ class MemTrackerLimiter final : public MemTracker { bool _enable_print_log_usage = false; static std::atomic _enable_print_log_process_usage; + static std::vector mem_tracker_limiter_pool; + // Iterator into mem_tracker_limiter_pool for this object. Stored to have O(1) remove. std::list::iterator _tracker_limiter_group_it; };