summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniil Fedotov <daniil@rabbitmq.com>2017-06-15 10:30:47 +0100
committerGerhard Lazu <gerhard@rabbitmq.com>2017-06-15 10:30:47 +0100
commita0151e487b84f7159ca99b5efe1175de4faba791 (patch)
tree7b4fa35be73cd92b3a56dfca79dbb159d6762b85
parentbc0309d9218be7786eb80f96e1065c97042905c9 (diff)
downloadrabbitmq-server-git-a0151e487b84f7159ca99b5efe1175de4faba791.tar.gz
Move function that reports total used memory
Tests were failing because they required vm_memory_monitor process to be running re #1259 [#145451399] Signed-off-by: Gerhard Lazu <gerhard@rabbitmq.com>
-rw-r--r--src/rabbit_vm.erl97
-rw-r--r--src/vm_memory_monitor.erl100
2 files changed, 97 insertions, 100 deletions
diff --git a/src/rabbit_vm.erl b/src/rabbit_vm.erl
index 648ad9d8a3..06b91e041d 100644
--- a/src/rabbit_vm.erl
+++ b/src/rabbit_vm.erl
@@ -16,7 +16,7 @@
-module(rabbit_vm).
--export([memory/0, binary/0, ets_tables_memory/1]).
+-export([memory/0, total_memory/0, binary/0, ets_tables_memory/1]).
-define(MAGIC_PLUGINS, ["cowboy", "sockjs", "rfc4627_jsonrpc"]).
@@ -51,7 +51,7 @@ memory() ->
0
end,
MgmtDbETS = ets_memory([rabbit_mgmt_storage]),
- {OsTotal, _} = vm_memory_monitor:get_memory_use(bytes),
+ OsTotal = total_memory(),
[{total, ErlangTotal},
@@ -101,12 +101,103 @@ memory() ->
{total, OsTotal}
].
-
%% [1] - erlang:memory(processes) can be less than the sum of its
%% parts. Rather than display something nonsensical, just silence any
%% claims about negative memory. See
%% http://erlang.org/pipermail/erlang-questions/2012-September/069320.html
+%% Memory reported by erlang:memory(total) is not supposed to
+%% be equal to the total size of all pages mapped to the emulator,
+%% according to http://erlang.org/doc/man/erlang.html#memory-0
+%% erlang:memory(total) under-reports memory usage by around 20%
+-spec total_memory() -> Bytes :: integer().
+total_memory() ->
+ case get_memory_calculation_strategy() of
+ rss ->
+ case get_system_process_resident_memory() of
+ {ok, MemInBytes} ->
+ MemInBytes;
+ {error, Reason} ->
+ rabbit_log:debug("Unable to get system memory used. Reason: ~p."
+ " Falling back to erlang memory reporting",
+ [Reason]),
+ erlang:memory(total)
+ end;
+ erlang ->
+ erlang:memory(total)
+ end.
+
+-spec get_memory_calculation_strategy() -> rss | erlang.
+get_memory_calculation_strategy() ->
+ case application:get_env(rabbit, vm_memory_calculation_strategy, rss) of
+ erlang ->
+ erlang;
+ rss ->
+ rss;
+ UnsupportedValue ->
+ rabbit_log:warning(
+ "Unsupported value '~p' for vm_memory_calculation_strategy. "
+ "Supported values: (rss|erlang). "
+ "Defaulting to 'rss'",
+ [UnsupportedValue]
+ ),
+ rss
+ end.
+
+-spec get_system_process_resident_memory() -> {ok, Bytes :: integer()} | {error, term()}.
+get_system_process_resident_memory() ->
+ try
+ get_system_process_resident_memory(os:type())
+ catch _:Error ->
+ {error, {"Failed to get process resident memory", Error}}
+ end.
+
+get_system_process_resident_memory({unix,darwin}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory({unix, linux}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory({unix,freebsd}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory({unix,openbsd}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory({win32,_OSname}) ->
+ OsPid = os:getpid(),
+ Cmd = " tasklist /fi \"pid eq " ++ OsPid ++ "\" /fo LIST 2>&1 ",
+ CmdOutput = os:cmd(Cmd),
+ %% Memory usage is displayed in kilobytes
+ %% with comma-separated thousands
+ case re:run(CmdOutput, "Mem Usage:\\s+([0-9,]+)\\s+K", [{capture, all_but_first, list}]) of
+ {match, [Match]} ->
+ NoCommas = [ N || N <- Match, N =/= $, ],
+ {ok, list_to_integer(NoCommas) * 1024};
+ _ ->
+ {error, {unexpected_output_from_command, Cmd, CmdOutput}}
+ end;
+
+get_system_process_resident_memory({unix, sunos}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory({unix, aix}) ->
+ get_ps_memory();
+
+get_system_process_resident_memory(_OsType) ->
+ {error, not_implemented_for_os}.
+
+get_ps_memory() ->
+ OsPid = os:getpid(),
+ Cmd = "ps -p " ++ OsPid ++ " -o rss=",
+ CmdOutput = os:cmd(Cmd),
+ case re:run(CmdOutput, "[0-9]+", [{capture, first, list}]) of
+ {match, [Match]} ->
+ {ok, list_to_integer(Match) * 1024};
+ _ ->
+ {error, {unexpected_output_from_command, Cmd, CmdOutput}}
+ end.
+
binary() ->
All = interesting_sups(),
{Sums, Rest} =
diff --git a/src/vm_memory_monitor.erl b/src/vm_memory_monitor.erl
index 6731466c17..bc45d04d62 100644
--- a/src/vm_memory_monitor.erl
+++ b/src/vm_memory_monitor.erl
@@ -117,14 +117,14 @@ get_memory_limit() ->
get_memory_use(bytes) ->
MemoryLimit = get_memory_limit(),
- {get_used_memory(), case MemoryLimit > 0.0 of
+ {rabbit_vm:total_memory(), case MemoryLimit > 0.0 of
true -> MemoryLimit;
false -> infinity
end};
get_memory_use(ratio) ->
MemoryLimit = get_memory_limit(),
case MemoryLimit > 0.0 of
- true -> get_used_memory() / MemoryLimit;
+ true -> rabbit_vm:total_memory() / MemoryLimit;
false -> infinity
end.
@@ -268,7 +268,7 @@ parse_mem_limit(_) ->
internal_update(State = #state { memory_limit = MemLimit,
alarmed = Alarmed,
alarm_funs = {AlarmSet, AlarmClear} }) ->
- MemUsed = get_used_memory(),
+ MemUsed = rabbit_vm:total_memory(),
NewAlarmed = MemUsed > MemLimit,
case {Alarmed, NewAlarmed} of
{false, true} -> emit_update_info(set, MemUsed, MemLimit),
@@ -366,52 +366,6 @@ get_total_memory(_OsType) ->
unknown.
-get_ps_memory() ->
- OsPid = os:getpid(),
- Cmd = "ps -p " ++ OsPid ++ " -o rss=",
- CmdOutput = cmd(Cmd),
- case re:run(CmdOutput, "[0-9]+", [{capture, first, list}]) of
- {match, [Match]} ->
- {ok, list_to_integer(Match) * 1024};
- _ ->
- {error, {unexpected_output_from_command, Cmd, CmdOutput}}
- end.
-
-get_system_process_resident_memory({unix,darwin}) ->
- get_ps_memory();
-
-get_system_process_resident_memory({unix, linux}) ->
- get_ps_memory();
-
-get_system_process_resident_memory({unix,freebsd}) ->
- get_ps_memory();
-
-get_system_process_resident_memory({unix,openbsd}) ->
- get_ps_memory();
-
-get_system_process_resident_memory({win32,_OSname}) ->
- OsPid = os:getpid(),
- Cmd = " tasklist /fi \"pid eq " ++ OsPid ++ "\" /fo LIST 2>&1 ",
- CmdOutput = os:cmd(Cmd),
- %% Memory usage is displayed in kilobytes
- %% with comma-separated thousands
- case re:run(CmdOutput, "Mem Usage:\\s+([0-9,]+)\\s+K", [{capture, all_but_first, list}]) of
- {match, [Match]} ->
- NoCommas = [ N || N <- Match, N =/= $, ],
- {ok, list_to_integer(NoCommas) * 1024};
- _ ->
- {error, {unexpected_output_from_command, Cmd, CmdOutput}}
- end;
-
-get_system_process_resident_memory({unix, sunos}) ->
- get_ps_memory();
-
-get_system_process_resident_memory({unix, aix}) ->
- get_ps_memory();
-
-get_system_process_resident_memory(_OsType) ->
- {error, not_implemented_for_os}.
-
%% A line looks like "Foo bar: 123456."
parse_line_mach(Line) ->
[Name, RHS | _Rest] = string:tokens(Line, ":"),
@@ -494,51 +448,3 @@ read_proc_file(IoDevice, Acc) ->
{ok, Res} -> read_proc_file(IoDevice, [Res | Acc]);
eof -> Acc
end.
-
--spec get_memory_calculation_strategy() -> rss | erlang.
-get_memory_calculation_strategy() ->
- case application:get_env(rabbit, vm_memory_calculation_strategy, rss) of
- erlang ->
- erlang;
- rss ->
- rss;
- UnsupportedValue ->
- rabbit_log:warning(
- "Unsupported value '~p' for vm_memory_calculation_strategy. "
- "Supported values: (rss|erlang). "
- "Defaulting to 'rss'",
- [UnsupportedValue]
- ),
- rss
- end.
-
-
-%% Memory reported by erlang:memory(total) is not supposed to
-%% be equal to the total size of all pages mapped to the emulator,
-%% according to http://erlang.org/doc/man/erlang.html#memory-0
-%% erlang:memory(total) under-reports memory usage by around 20%
--spec get_used_memory() -> Bytes :: integer().
-get_used_memory() ->
- case get_memory_calculation_strategy() of
- rss ->
- case get_system_process_resident_memory() of
- {ok, MemInBytes} ->
- MemInBytes;
- {error, Reason} ->
- rabbit_log:debug("Unable to get system memory used. Reason: ~p."
- " Falling back to erlang memory reporting",
- [Reason]),
- erlang:memory(total)
- end;
- erlang ->
- erlang:memory(total)
- end.
-
-
--spec get_system_process_resident_memory() -> {ok, Bytes :: integer()} | {error, term()}.
-get_system_process_resident_memory() ->
- try
- get_system_process_resident_memory(os:type())
- catch _:Error ->
- {error, {"Failed to get process resident memory", Error}}
- end.