File 0790-logger_olp-check_load-1-only-retrieve-memory-metric-.patch of Package erlang
From 748ce3e58ab0d58fb84e71a44bc861f6e904f4e1 Mon Sep 17 00:00:00 2001
From: Mikael Pettersson <mikael.pettersson@klarna.com>
Date: Mon, 5 Jun 2023 10:42:59 +0200
Subject: [PATCH] logger_olp:check_load/1: only retrieve memory metric if
absolutely necessary
Fixes #7417
---
lib/kernel/src/logger_olp.erl | 20 +++++++++++++++++++-
1 file changed, 19 insertions(+), 1 deletion(-)
diff --git a/lib/kernel/src/logger_olp.erl b/lib/kernel/src/logger_olp.erl
index 6bbf9963b6..ca5242135c 100644
--- a/lib/kernel/src/logger_olp.erl
+++ b/lib/kernel/src/logger_olp.erl
@@ -473,7 +473,7 @@ check_load(State = #{id:=_Name, mode_ref := ModeRef, mode := Mode,
sync_mode_qlen := SyncModeQLen,
drop_mode_qlen := DropModeQLen,
flush_qlen := FlushQLen}) ->
- {_,Mem} = process_info(self(), memory),
+ Mem = maybe_self_memory(State),
?observe(_Name,{max_mem,Mem}),
{_,QLen} = process_info(self(), message_queue_len),
?observe(_Name,{max_qlen,QLen}),
@@ -507,6 +507,24 @@ check_load(State = #{id:=_Name, mode_ref := ModeRef, mode := Mode,
?update_other(flushes,FLUSHES,_NewFlushes,
State4#{last_qlen => QLen})}.
+%% Calling process_info(self(), memory) is linear on the size of the message queue,
+%% which is an extremely bad thing to do in high load situations, so only do that
+%% if the value actually is required.
+-ifdef(OBSERVER_MOD). % does ?observe/2 use Mem
+maybe_self_memory(_State) -> do_self_memory().
+-else.
+-ifdef(SAVE_STATS). % does ?update_max_mem/2 use Mem
+maybe_self_memory(_State) -> do_self_memory().
+-else.
+maybe_self_memory(#{overload_kill_enable := KillIfOL}) -> % does kill_if_choked/3 use Mem
+ KillIfOL andalso do_self_memory(). % deliberate non-number if unused
+-endif.
+-endif.
+
+do_self_memory() ->
+ {_, Mem} = process_info(self(), memory),
+ Mem.
+
limit_burst(#{burst_limit_enable := false}=State) ->
{true,State};
limit_burst(#{burst_win_ts := BurstWinT0,
--
2.35.3