summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_memory_monitor.erl25
1 files changed, 17 insertions, 8 deletions
diff --git a/src/rabbit_memory_monitor.erl b/src/rabbit_memory_monitor.erl
index e8d2d1d1bc..3ce3a955dc 100644
--- a/src/rabbit_memory_monitor.erl
+++ b/src/rabbit_memory_monitor.erl
@@ -36,6 +36,7 @@
queue_durations, %% ets #process
queue_duration_sum, %% sum of all queue_durations
queue_duration_count, %% number of elements in sum
+ last_memory_limit, %% memory limit at last update
desired_duration %% the desired queue duration
}).
@@ -109,6 +110,8 @@ stop() ->
%%----------------------------------------------------------------------------
init([]) ->
+ LastLimit = memory_limit(?MEMORY_SIZE_FOR_DISABLED_VMM),
+
{ok, TRef} = timer:apply_interval(?DEFAULT_UPDATE_INTERVAL,
?SERVER, update, []),
@@ -119,6 +122,7 @@ init([]) ->
queue_durations = Ets,
queue_duration_sum = 0.0,
queue_duration_count = 0,
+ last_memory_limit = LastLimit,
desired_duration = infinity })}.
handle_call({report_ram_duration, Pid, QueueDuration}, From,
@@ -214,16 +218,12 @@ internal_deregister(Pid, Demonitor,
queue_duration_count = Count1 }
end.
-internal_update(State = #state { queue_durations = Durations,
+internal_update(State = #state { last_memory_limit = LastLimit,
+ queue_durations = Durations,
desired_duration = DesiredDurationAvg,
queue_duration_sum = Sum,
queue_duration_count = Count }) ->
- MemoryLimit = trunc(?MEMORY_LIMIT_SCALING *
- (try
- vm_memory_monitor:get_memory_limit()
- catch
- exit:{noproc, _} -> ?MEMORY_SIZE_FOR_DISABLED_VMM
- end)),
+ MemoryLimit = memory_limit(LastLimit),
MemoryRatio = erlang:memory(total) / MemoryLimit,
DesiredDurationAvg1 =
case MemoryRatio < ?LIMIT_THRESHOLD orelse Count == 0 of
@@ -236,7 +236,8 @@ internal_update(State = #state { queue_durations = Durations,
end,
(Sum1 / Count) / MemoryRatio
end,
- State1 = State #state { desired_duration = DesiredDurationAvg1 },
+ State1 = State #state { last_memory_limit = MemoryLimit,
+ desired_duration = DesiredDurationAvg1 },
%% only inform queues immediately if the desired duration has
%% decreased
@@ -274,3 +275,11 @@ internal_update(State = #state { queue_durations = Durations,
end, true, Durations)
end,
State1.
+
+memory_limit(Default) ->
+ trunc(?MEMORY_LIMIT_SCALING *
+ (try
+ vm_memory_monitor:get_memory_limit()
+ catch
+ exit:{noproc, _} -> Default
+ end)).