summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorEmile Joubert <emile@rabbitmq.com>2011-08-31 09:51:48 +0100
committerEmile Joubert <emile@rabbitmq.com>2011-08-31 09:51:48 +0100
commitc74d6ceb4d578d741aa71f7783f07cc0f8b26c4b (patch)
tree290f596c5ac31b0e1c039850299326ecbb6a114d /src
parent564876de92a4074b733f004fb9b2330f91d78e2c (diff)
parent6f449624030197406dd43a79d6b478ab8b7dad0e (diff)
downloadrabbitmq-server-git-c74d6ceb4d578d741aa71f7783f07cc0f8b26c4b.tar.gz
Merged default into bug24323
Diffstat (limited to 'src')
-rw-r--r--src/rabbit.erl8
-rw-r--r--src/rabbit_control.erl5
-rw-r--r--src/vm_memory_monitor.erl54
3 files changed, 44 insertions, 23 deletions
diff --git a/src/rabbit.erl b/src/rabbit.erl
index b8dbccc767..2403d027e9 100644
--- a/src/rabbit.erl
+++ b/src/rabbit.erl
@@ -239,7 +239,13 @@ status() ->
{running_applications, application:which_applications(infinity)},
{os, os:type()},
{erlang_version, erlang:system_info(system_version)},
- {memory, erlang:memory()}].
+ {memory, erlang:memory()}] ++
+ case is_running() of
+ true -> [{vm_memory_high_watermark,
+ vm_memory_monitor:get_vm_memory_high_watermark()},
+ {vm_memory_limit, vm_memory_monitor:get_memory_limit()}];
+ false -> []
+ end.
is_running() -> is_running(node()).
diff --git a/src/rabbit_control.erl b/src/rabbit_control.erl
index 1163ae9d86..9034c81f99 100644
--- a/src/rabbit_control.erl
+++ b/src/rabbit_control.erl
@@ -321,6 +321,11 @@ action(trace_off, Node, [], Opts, Inform) ->
Inform("Stopping tracing for vhost ~p", [VHost]),
rpc_call(Node, rabbit_trace, stop, [list_to_binary(VHost)]);
+action(set_vm_memory_high_watermark, Node, [Arg], _Opts, Inform) ->
+ Frac = list_to_float("0" ++ Arg),
+ Inform("Setting memory threshhold on ~p to ~p", [Node, Frac]),
+ rpc_call(Node, vm_memory_monitor, set_vm_memory_high_watermark, [Frac]);
+
action(set_permissions, Node, [Username, CPerm, WPerm, RPerm], Opts, Inform) ->
VHost = proplists:get_value(?VHOST_OPT, Opts),
Inform("Setting permissions for user ~p in vhost ~p", [Username, VHost]),
diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl
index fb2fa267cb..3b95591488 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,20 @@ 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(set_mem_limits(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 = set_mem_limits(State, MemFraction),
error_logger:info_msg("Memory alarm changed to ~p, ~p bytes.~n",
- [MemFraction, MemLimit]),
- {reply, ok, State#state{memory_limit = MemLimit}};
+ [MemFraction, State1#state.memory_limit]),
+ {reply, ok, State1};
handle_call(get_check_interval, _From, State) ->
{reply, State#state.timeout, State};
@@ -168,6 +154,30 @@ code_change(_OldVsn, State, _Extra) ->
%% Server Internals
%%----------------------------------------------------------------------------
+set_mem_limits(State, MemFraction) ->
+ TotalMemory =
+ case get_total_memory() of
+ unknown ->
+ case State of
+ #state { total_memory = undefined,
+ memory_limit = undefined } ->
+ 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)]);
+ _ ->
+ ok
+ end,
+ ?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 +332,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;
_ ->