diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit_memory_monitor.erl | 26 | ||||
| -rw-r--r-- | src/vm_memory_monitor.erl | 14 |
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 %%---------------------------------------------------------------------------- |
