diff options
| -rw-r--r-- | src/rabbit_memory_monitor.erl | 25 |
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)). |
