[fix](memtracker) Fix thread mem tracker try consume accuracy #12782
This commit is contained in:
@ -25,7 +25,6 @@
|
||||
#include "gutil/walltime.h"
|
||||
#include "runtime/runtime_state.h"
|
||||
#include "runtime/thread_context.h"
|
||||
#include "service/backend_options.h"
|
||||
#include "util/pretty_printer.h"
|
||||
#include "util/string_util.h"
|
||||
|
||||
@ -192,36 +191,34 @@ std::string MemTrackerLimiter::log_usage(int max_recursive_depth,
|
||||
return usage_strings.size() == 0 ? "" : "\n " + join(usage_strings, "\n ");
|
||||
}
|
||||
|
||||
Status MemTrackerLimiter::mem_limit_exceeded_construct(const std::string& msg) {
|
||||
std::string detail = fmt::format(
|
||||
"{}. backend {} process memory used {}, limit {}. If query tracker exceed, `set "
|
||||
"exec_mem_limit=8G` to change limit, details mem usage see be.INFO.",
|
||||
msg, BackendOptions::get_localhost(), print_bytes(PerfCounters::get_vm_rss()),
|
||||
print_bytes(MemInfo::mem_limit()));
|
||||
return Status::MemoryLimitExceeded(detail);
|
||||
}
|
||||
|
||||
void MemTrackerLimiter::print_log_usage(const std::string& msg) {
|
||||
DCHECK(_limit != -1);
|
||||
// only print the tracker log_usage in be log.
|
||||
std::string detail = msg;
|
||||
detail += "\n " + fmt::format(
|
||||
"process memory used {}, limit {}, hard limit {}, tc/jemalloc "
|
||||
"allocator cache {}",
|
||||
PerfCounters::get_vm_rss_str(), MemInfo::mem_limit_str(),
|
||||
print_bytes(MemInfo::hard_mem_limit()),
|
||||
MemInfo::allocator_cache_mem_str());
|
||||
if (_print_log_usage) {
|
||||
if (_label == "Process") {
|
||||
// Dumping the process MemTracker is expensive. Limiting the recursive depth to two
|
||||
// levels limits the level of detail to a one-line summary for each query MemTracker.
|
||||
detail += "\n" + log_usage(2);
|
||||
detail += "\n " + log_usage(2);
|
||||
} else {
|
||||
detail += "\n" + log_usage();
|
||||
detail += "\n " + log_usage();
|
||||
}
|
||||
// TODO: memory leak by calling `boost::stacktrace` in mem hook
|
||||
// TODO: memory leak by calling `boost::stacktrace` in tcmalloc hook,
|
||||
// test whether overwriting malloc/free is the same problem in jemalloc/tcmalloc.
|
||||
// detail += "\n" + boost::stacktrace::to_string(boost::stacktrace::stacktrace());
|
||||
LOG(WARNING) << detail;
|
||||
_print_log_usage = false;
|
||||
}
|
||||
}
|
||||
|
||||
Status MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
int64_t failed_allocation_size) {
|
||||
std::string MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
int64_t failed_allocation_size) {
|
||||
STOP_CHECK_THREAD_MEM_TRACKER_LIMIT();
|
||||
std::string detail = fmt::format("Memory limit exceeded:<consuming tracker:<{}>, ", _label);
|
||||
MemTrackerLimiter* exceeded_tracker = nullptr;
|
||||
@ -242,19 +239,13 @@ Status MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
}
|
||||
}
|
||||
|
||||
auto sys_exceed_st = check_sys_mem_info(failed_allocation_size);
|
||||
MemTrackerLimiter* print_log_usage_tracker = nullptr;
|
||||
if (exceeded_tracker != nullptr) {
|
||||
detail += fmt::format(
|
||||
"failed alloc size {}, exceeded tracker:<{}>, limit {}, peak used {}, "
|
||||
"current used {}>, executing msg:<{}>",
|
||||
print_bytes(failed_allocation_size), exceeded_tracker->label(),
|
||||
print_bytes(exceeded_tracker->limit()),
|
||||
print_bytes(exceeded_tracker->peak_consumption()),
|
||||
print_bytes(exceeded_tracker->consumption()), msg);
|
||||
detail += limit_exceeded_errmsg_prefix_str(failed_allocation_size, exceeded_tracker);
|
||||
print_log_usage_tracker = exceeded_tracker;
|
||||
} else if (!sys_exceed_st) {
|
||||
detail += fmt::format("{}>, executing msg:<{}>", sys_exceed_st.get_error_msg(), msg);
|
||||
} else if (sys_mem_exceed_limit_check(failed_allocation_size)) {
|
||||
detail += fmt::format("{}>, executing msg:<{}>",
|
||||
limit_exceeded_errmsg_sys_str(failed_allocation_size), msg);
|
||||
} else if (max_consumption_tracker != nullptr) {
|
||||
// must after check_sys_mem_info false
|
||||
detail += fmt::format(
|
||||
@ -271,29 +262,28 @@ Status MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
detail += fmt::format("unknown exceed reason, executing msg:<{}>", msg);
|
||||
print_log_usage_tracker = ExecEnv::GetInstance()->process_mem_tracker_raw();
|
||||
}
|
||||
auto st = MemTrackerLimiter::mem_limit_exceeded_construct(detail);
|
||||
if (print_log_usage_tracker != nullptr)
|
||||
print_log_usage_tracker->print_log_usage(st.get_error_msg());
|
||||
return st;
|
||||
auto failed_msg = MemTrackerLimiter::limit_exceeded_errmsg_suffix_str(detail);
|
||||
if (print_log_usage_tracker != nullptr) print_log_usage_tracker->print_log_usage(failed_msg);
|
||||
return failed_msg;
|
||||
}
|
||||
|
||||
Status MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
MemTrackerLimiter* failed_tracker,
|
||||
Status failed_try_consume_st) {
|
||||
std::string MemTrackerLimiter::mem_limit_exceeded(const std::string& msg,
|
||||
MemTrackerLimiter* failed_tracker,
|
||||
const std::string& limit_exceeded_errmsg_prefix) {
|
||||
STOP_CHECK_THREAD_MEM_TRACKER_LIMIT();
|
||||
std::string detail =
|
||||
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());
|
||||
return st;
|
||||
_label, limit_exceeded_errmsg_prefix, msg);
|
||||
auto failed_msg = MemTrackerLimiter::limit_exceeded_errmsg_suffix_str(detail);
|
||||
failed_tracker->print_log_usage(failed_msg);
|
||||
return failed_msg;
|
||||
}
|
||||
|
||||
Status MemTrackerLimiter::mem_limit_exceeded(RuntimeState* state, const std::string& msg,
|
||||
int64_t failed_alloc_size) {
|
||||
Status rt = mem_limit_exceeded(msg, failed_alloc_size);
|
||||
state->log_error(rt.to_string());
|
||||
return rt;
|
||||
auto failed_msg = mem_limit_exceeded(msg, failed_alloc_size);
|
||||
state->log_error(failed_msg);
|
||||
return Status::MemoryLimitExceeded(failed_msg);
|
||||
}
|
||||
|
||||
} // namespace doris
|
||||
|
||||
Reference in New Issue
Block a user