This is an automated email from the ASF dual-hosted git repository.
yiguolei pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push:
new 09b8d32421 [fix](memtracker) Fix mem limit exceed return wrong format
(#12139)
09b8d32421 is described below
commit 09b8d32421c2dc5b899d020fdc7c670b370c569c
Author: Xinyi Zou <[email protected]>
AuthorDate: Mon Aug 29 21:07:02 2022 +0800
[fix](memtracker) Fix mem limit exceed return wrong format (#12139)
---
be/src/runtime/memory/mem_tracker_limiter.cpp | 29 ++++++++++++---------------
be/src/runtime/memory/mem_tracker_limiter.h | 12 +++++------
2 files changed, 18 insertions(+), 23 deletions(-)
diff --git a/be/src/runtime/memory/mem_tracker_limiter.cpp
b/be/src/runtime/memory/mem_tracker_limiter.cpp
index 87a49eedce..13e888959a 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.cpp
+++ b/be/src/runtime/memory/mem_tracker_limiter.cpp
@@ -50,7 +50,8 @@ MemTrackerLimiter::MemTrackerLimiter(int64_t byte_limit,
const std::string& labe
MemTrackerLimiter* tracker = this;
while (tracker != nullptr) {
_all_ancestors.push_back(tracker);
- if (tracker->has_limit()) _limited_ancestors.push_back(tracker);
+ if (tracker->has_limit() && tracker->label() != "Process")
+ _limited_ancestors.push_back(tracker);
tracker = tracker->_parent.get();
}
DCHECK_GT(_all_ancestors.size(), 0);
@@ -150,7 +151,7 @@ bool MemTrackerLimiter::gc_memory(int64_t max_consumption) {
Status MemTrackerLimiter::try_gc_memory(int64_t bytes) {
if (UNLIKELY(gc_memory(_limit - bytes))) {
return Status::MemoryLimitExceeded(fmt::format(
- "failed_alloc_size={}Bytes, exceeded_tracker={}, limit={}B,
peak_used={}B, "
+ "failed_alloc_size={}B, exceeded_tracker={}, limit={}B,
peak_used={}B, "
"current_used={}B",
bytes, label(), _limit, _consumption->value(),
_consumption->current_value()));
}
@@ -227,7 +228,7 @@ std::string MemTrackerLimiter::log_usage(int
max_recursive_depth,
Status MemTrackerLimiter::mem_limit_exceeded_construct(const std::string& msg)
{
std::string detail = fmt::format(
- "{}, backend {} process memory used {}Bytes, process limit {}B. If
is query, can "
+ "{}, backend {} process memory used {}, process limit {}. If is
query, can "
"change the limit "
"by `set exec_mem_limit=xxx`, details mem usage see be.INFO.",
msg, BackendOptions::get_localhost(),
@@ -257,17 +258,12 @@ void MemTrackerLimiter::print_log_usage(const
std::string& msg) {
Status MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
int64_t failed_allocation_size) {
STOP_CHECK_THREAD_MEM_TRACKER_LIMIT();
- DCHECK(!_limited_ancestors.empty());
- std::string detail = fmt::format("Memory limit exceeded,
<consuming_tracker={}, ", _label);
- if (failed_allocation_size != 0)
- detail += fmt::format("failed_alloc_size={}Bytes, ",
- PrettyPrinter::print(failed_allocation_size,
TUnit::BYTES));
+ std::string detail = fmt::format("Memory limit
exceeded:<consuming_tracker={}, ", _label);
MemTrackerLimiter* exceeded_tracker = nullptr;
MemTrackerLimiter* max_consumption_tracker = nullptr;
int64_t free_size = INT64_MAX;
// Find the tracker that exceed limit and has the least free.
for (const auto& tracker : _limited_ancestors) {
- if (tracker->label() == "Process") continue;
int64_t max_consumption = tracker->peak_consumption() >
tracker->consumption()
? tracker->peak_consumption()
: tracker->consumption();
@@ -285,19 +281,20 @@ Status MemTrackerLimiter::mem_limit_exceeded(const
std::string& msg,
MemTrackerLimiter* print_log_usage_tracker = nullptr;
if (exceeded_tracker != nullptr) {
detail += fmt::format(
- "exceeded_tracker={}, limit={}B, peak_used={}B,
current_used={}B>, "
- "executing_msg:<{}>",
+ "failed_alloc_size={}B, exceeded_tracker={}, limit={}B,
peak_used={}B, "
+ "current_used={}B>, executing_msg:<{}>",
+ PrettyPrinter::print(failed_allocation_size, TUnit::BYTES),
exceeded_tracker->label(), exceeded_tracker->limit(),
exceeded_tracker->peak_consumption(),
exceeded_tracker->consumption(), msg);
print_log_usage_tracker = exceeded_tracker;
} else if (!sys_exceed_st) {
- detail = fmt::format("Memory limit exceeded, {}, executing_msg:<{}>",
- sys_exceed_st.get_error_msg(), msg);
+ detail += fmt::format("{}>, executing_msg:<{}>",
sys_exceed_st.get_error_msg(), msg);
} else if (max_consumption_tracker != nullptr) {
// must after check_sys_mem_info false
detail += fmt::format(
- "max_consumption_tracker={}, limit={}B, peak_used={}B,
current_used={}B>, "
- "executing_msg:<{}>",
+ "failed_alloc_size={}B, max_consumption_tracker={}, limit={}B,
peak_used={}B, "
+ "current_used={}B>, executing_msg:<{}>",
+ PrettyPrinter::print(failed_allocation_size, TUnit::BYTES),
max_consumption_tracker->label(),
max_consumption_tracker->limit(),
max_consumption_tracker->peak_consumption(),
max_consumption_tracker->consumption(),
msg);
@@ -319,7 +316,7 @@ Status MemTrackerLimiter::mem_limit_exceeded(const
std::string& msg,
Status failed_try_consume_st) {
STOP_CHECK_THREAD_MEM_TRACKER_LIMIT();
std::string detail =
- fmt::format("memory limit exceeded:<consuming_tracker={}, {}>,
executing_msg:<{}>",
+ fmt::format("Memory limit exceeded:<consuming_tracker={}, {}>,
executing_msg:<{}>",
_label, failed_try_consume_st.get_error_msg(), msg);
auto st = MemTrackerLimiter::mem_limit_exceeded_construct(detail);
failed_tracker->print_log_usage(st.get_error_msg());
diff --git a/be/src/runtime/memory/mem_tracker_limiter.h
b/be/src/runtime/memory/mem_tracker_limiter.h
index 3aaa9d973f..65506964a8 100644
--- a/be/src/runtime/memory/mem_tracker_limiter.h
+++ b/be/src/runtime/memory/mem_tracker_limiter.h
@@ -64,16 +64,15 @@ public:
size_t upper_level) const;
public:
- Status check_sys_mem_info(int64_t bytes) {
+ static Status check_sys_mem_info(int64_t bytes) {
// Limit process memory usage using the actual physical memory of the
process in `/proc/self/status`.
// 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()) {
auto st = Status::MemoryLimitExceeded(
- "Memory limit exceeded, process memory used {}Bytes exceed
limit {}B, "
- "consuming_tracker={}, failed_alloc_size={}",
- PerfCounters::get_vm_rss(), MemInfo::mem_limit(), _label,
bytes);
+ "process memory used {} exceed limit {},
failed_alloc_size={}",
+ PerfCounters::get_vm_rss(), MemInfo::mem_limit(), bytes);
ExecEnv::GetInstance()->process_mem_tracker()->print_log_usage(st.get_error_msg());
return st;
}
@@ -212,7 +211,7 @@ private:
// this tracker limiter plus all of its ancestors
std::vector<MemTrackerLimiter*> _all_ancestors;
- // _all_ancestors with valid limits
+ // _all_ancestors with valid limits, except process tracker
std::vector<MemTrackerLimiter*> _limited_ancestors;
// Consume size smaller than mem_tracker_consume_min_size_bytes will
continue to accumulate
@@ -284,7 +283,7 @@ inline Status MemTrackerLimiter::try_consume(int64_t bytes)
{
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 || _label == "Process") {
+ if (tracker->limit() < 0 || tracker->label() == "Process") {
tracker->_consumption->add(bytes); // No limit at this tracker.
} else {
// If TryConsume fails, we can try to GC, but we may need to try
several times if
@@ -317,7 +316,6 @@ inline Status MemTrackerLimiter::check_limit(int64_t bytes)
{
MemTrackerLimiter* tracker = _limited_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->label() == "Process") continue;
while (true) {
if (LIKELY(tracker->_consumption->current_value() + bytes <
tracker->limit())) break;
RETURN_IF_ERROR(tracker->try_gc_memory(bytes));
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]