summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/rabbit_memory_monitor.erl26
-rw-r--r--src/vm_memory_monitor.erl14
2 files changed, 24 insertions, 16 deletions
diff --git a/src/rabbit_memory_monitor.erl b/src/rabbit_memory_monitor.erl
index db4949e48a..0629591ad7 100644
--- a/src/rabbit_memory_monitor.erl
+++ b/src/rabbit_memory_monitor.erl
@@ -95,6 +95,10 @@
-define(DEFAULT_UPDATE_INTERVAL_MS, 2500).
-define(TABLE_NAME, ?MODULE).
-define(MAX_QUEUE_DURATION_ALLOWED, 60*60*24). % 1 day
+
+%% If user disabled vm_memory_monitor, let's assume 1GB of memory we can use.
+-define(MEMORY_SIZE_FOR_DISABLED_VMM, 1073741824).
+
%%----------------------------------------------------------------------------
-ifdef(use_specs).
-type(state() :: #state{timer :: timer:tref(),
@@ -136,26 +140,18 @@ push_queue_duration(Pid, QueueDuration) ->
%%----------------------------------------------------------------------------
-get_user_memory_limit() ->
- %% TODO: References to os_mon and rabbit_memsup_linux
- %% should go away as bug 21457 removes it.
- %% BTW: memsup:get_system_memory_data() doesn't work.
- {state, TotalMemory, _Allocated} = rabbit_memsup_linux:update({state, 0,0}),
- MemoryHighWatermark = os_mon:get_env(memsup, system_memory_high_watermark),
- Limit = erlang:trunc(TotalMemory * MemoryHighWatermark),
- %% no more than two gigs on 32 bits.
- case (Limit > 2*1024*1024*1024) and (erlang:system_info(wordsize) == 4) of
- true -> 2*1024*1024*1024;
- false -> Limit
+get_memory_limit() ->
+ RabbitMemoryLimit = case vm_memory_monitor:get_memory_limit() of
+ undefined -> ?MEMORY_SIZE_FOR_DISABLED_VMM;
+ A -> A
end.
-
init([]) ->
%% We should never use more memory than user requested. As the memory
%% manager doesn't really know how much memory queues are using, we shall
- %% try to remain safe distance from real limit.
- MemoryLimit = trunc(get_user_memory_limit() * 0.6),
- rabbit_log:warning("Memory monitor limit: ~pMB~n",
+ %% try to remain safe distance from real throttle limit.
+ MemoryLimit = trunc(get_memory_limit() * 0.6),
+ rabbit_log:warning("Queues go to disk when memory is above: ~pMB~n",
[erlang:trunc(MemoryLimit/1048576)]),
{ok, TRef} = timer:apply_interval(?DEFAULT_UPDATE_INTERVAL_MS,
diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl
index 6da47933a4..6da6704d8d 100644
--- a/src/vm_memory_monitor.erl
+++ b/src/vm_memory_monitor.erl
@@ -51,7 +51,8 @@
-export([update/0, get_total_memory/0,
get_check_interval/0, set_check_interval/1,
- get_vm_memory_high_watermark/0, set_vm_memory_high_watermark/1]).
+ get_vm_memory_high_watermark/0, set_vm_memory_high_watermark/1,
+ get_memory_limit/0]).
-define(SERVER, ?MODULE).
@@ -76,6 +77,7 @@
-spec(start_link/1 :: (float()) -> ('ignore' | {error, any()} | {'ok', pid()})).
-spec(update/0 :: () -> 'ok').
-spec(get_total_memory/0 :: () -> (non_neg_integer() | unknown)).
+-spec(get_memory_limit/0 :: () -> (non_neg_integer() | undefined)).
-spec(get_check_interval/0 :: () -> non_neg_integer()).
-spec(set_check_interval/1 :: (non_neg_integer()) -> 'ok').
-spec(get_vm_memory_high_watermark/0 :: () -> float()).
@@ -128,6 +130,9 @@ handle_call({set_check_interval, Timeout}, _From, State) ->
{ok, cancel} = timer:cancel(State#state.timer),
{reply, ok, State#state{timeout = Timeout, timer = start_timer(Timeout)}};
+handle_call(get_memory_limit, _From, State) ->
+ {reply, State#state.memory_limit, State};
+
handle_call(_Request, _From, State) ->
{noreply, State}.
@@ -168,6 +173,13 @@ get_vm_memory_high_watermark() ->
set_vm_memory_high_watermark(Fraction) ->
gen_server2:call(?MODULE, {set_vm_memory_high_watermark, Fraction}).
+get_memory_limit() ->
+ try
+ gen_server2:call(?MODULE, get_memory_limit)
+ catch
+ exit:{noproc, _} -> undefined
+ end.
+
%%----------------------------------------------------------------------------
%% Server Internals
%%----------------------------------------------------------------------------