summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2011-08-17 14:17:09 +0100
committerEmile Joubert <emile@rabbitmq.com>2011-08-17 14:17:09 +0100
commit0773289662059115ceb537fd9ca96f5f93bf3cba (patch)
tree5abbbcb69caf82372354d1785a6ba7d909108c01 /src
parent1939ebd315d384336bd6e6dba8f78b5b4a8a7a91 (diff)
downloadrabbitmq-server-git-0773289662059115ceb537fd9ca96f5f93bf3cba.tar.gz
Query total RAM when updating highwatermark
Diffstat (limited to 'src')
-rw-r--r--src/rabbit.erl1
-rw-r--r--src/vm_memory_monitor.erl46
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;
_ ->