diff options
| author | Emile Joubert <emile@rabbitmq.com> | 2011-08-17 14:17:09 +0100 |
|---|---|---|
| committer | Emile Joubert <emile@rabbitmq.com> | 2011-08-17 14:17:09 +0100 |
| commit | 0773289662059115ceb537fd9ca96f5f93bf3cba (patch) | |
| tree | 5abbbcb69caf82372354d1785a6ba7d909108c01 /src | |
| parent | 1939ebd315d384336bd6e6dba8f78b5b4a8a7a91 (diff) | |
| download | rabbitmq-server-git-0773289662059115ceb537fd9ca96f5f93bf3cba.tar.gz | |
Query total RAM when updating highwatermark
Diffstat (limited to 'src')
| -rw-r--r-- | src/rabbit.erl | 1 | ||||
| -rw-r--r-- | src/vm_memory_monitor.erl | 46 |
2 files changed, 26 insertions, 21 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl index 138693f584..fdebeaf859 100644 --- a/src/rabbit.erl +++ b/src/rabbit.erl @@ -237,6 +237,7 @@ status() -> {erlang_version, erlang:system_info(system_version)}, {vm_memory_high_watermark, vm_memory_monitor:get_vm_memory_high_watermark()}, + {vm_memory_limit, vm_memory_monitor:get_memory_limit()}, {memory, erlang:memory()}]. environment() -> diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl index fb2fa267cb..bc673c01b5 100644 --- a/src/vm_memory_monitor.erl +++ b/src/vm_memory_monitor.erl @@ -40,6 +40,7 @@ -define(SERVER, ?MODULE). -define(DEFAULT_MEMORY_CHECK_INTERVAL, 1000). +-define(ONE_MB, 1048576). %% For an unknown OS, we assume that we have 1GB of memory. It'll be %% wrong. Scale by vm_memory_high_watermark in configuration to get a @@ -106,35 +107,21 @@ start_link(Args) -> gen_server:start_link({local, ?SERVER}, ?MODULE, [Args], []). init([MemFraction]) -> - TotalMemory = - case get_total_memory() of - unknown -> - error_logger:warning_msg( - "Unknown total memory size for your OS ~p. " - "Assuming memory size is ~pMB.~n", - [os:type(), trunc(?MEMORY_SIZE_FOR_UNKNOWN_OS/1048576)]), - ?MEMORY_SIZE_FOR_UNKNOWN_OS; - M -> M - end, - MemLimit = get_mem_limit(MemFraction, TotalMemory), - error_logger:info_msg("Memory limit set to ~pMB.~n", - [trunc(MemLimit/1048576)]), TRef = start_timer(?DEFAULT_MEMORY_CHECK_INTERVAL), - State = #state { total_memory = TotalMemory, - memory_limit = MemLimit, - timeout = ?DEFAULT_MEMORY_CHECK_INTERVAL, + State = #state { timeout = ?DEFAULT_MEMORY_CHECK_INTERVAL, timer = TRef, alarmed = false}, - {ok, internal_update(State)}. + {ok, internal_update(init_mem_state(State, MemFraction))}. handle_call(get_vm_memory_high_watermark, _From, State) -> {reply, State#state.memory_limit / State#state.total_memory, State}; handle_call({set_vm_memory_high_watermark, MemFraction}, _From, State) -> - MemLimit = get_mem_limit(MemFraction, State#state.total_memory), + State1 = init_mem_state(State, MemFraction), + MemLimit = get_mem_limit(MemFraction, State1#state.total_memory), error_logger:info_msg("Memory alarm changed to ~p, ~p bytes.~n", [MemFraction, MemLimit]), - {reply, ok, State#state{memory_limit = MemLimit}}; + {reply, ok, State1#state{memory_limit = MemLimit}}; handle_call(get_check_interval, _From, State) -> {reply, State#state.timeout, State}; @@ -168,6 +155,23 @@ code_change(_OldVsn, State, _Extra) -> %% Server Internals %%---------------------------------------------------------------------------- +init_mem_state(State, MemFraction) -> + TotalMemory = + case get_total_memory() of + unknown -> + error_logger:warning_msg( + "Unknown total memory size for your OS ~p. " + "Assuming memory size is ~pMB.~n", + [os:type(), trunc(?MEMORY_SIZE_FOR_UNKNOWN_OS/?ONE_MB)]), + ?MEMORY_SIZE_FOR_UNKNOWN_OS; + M -> M + end, + MemLim = get_mem_limit(MemFraction, TotalMemory), + error_logger:info_msg("Memory limit set to ~pMB of ~pMB total.~n", + [trunc(MemLim/?ONE_MB), trunc(TotalMemory/?ONE_MB)]), + State #state { total_memory = TotalMemory, + memory_limit = MemLim }. + internal_update(State = #state { memory_limit = MemLimit, alarmed = Alarmed}) -> MemUsed = erlang:memory(total), @@ -322,9 +326,9 @@ parse_line_sunos(Line) -> [Value1 | UnitsRest] = string:tokens(RHS, " "), Value2 = case UnitsRest of ["Gigabytes"] -> - list_to_integer(Value1) * 1024 * 1024 * 1024; + list_to_integer(Value1) * ?ONE_MB * 1024; ["Megabytes"] -> - list_to_integer(Value1) * 1024 * 1024; + list_to_integer(Value1) * ?ONE_MB; ["Kilobytes"] -> list_to_integer(Value1) * 1024; _ -> |
