diff options
author | Simon MacMullen <simon@rabbitmq.com> | 2014-12-05 11:24:14 +0000 |
---|---|---|
committer | Simon MacMullen <simon@rabbitmq.com> | 2014-12-05 11:24:14 +0000 |
commit | d7e77822640f57c6b8f6c5318985a604612f91d6 (patch) | |
tree | 27698af61498329fffc9575b4a27121065ceb3de | |
parent | 6205faa415846869ccabe016da6940dd2c966f2e (diff) | |
download | rabbitmq-server-d7e77822640f57c6b8f6c5318985a604612f91d6.tar.gz |
Add top_memory_use() and top_binary_refs().
-rw-r--r-- | src/rabbit_diagnostics.erl | 34 |
1 files changed, 31 insertions, 3 deletions
diff --git a/src/rabbit_diagnostics.erl b/src/rabbit_diagnostics.erl index bf45b757..3abd05a8 100644 --- a/src/rabbit_diagnostics.erl +++ b/src/rabbit_diagnostics.erl @@ -17,10 +17,11 @@ -module(rabbit_diagnostics). -define(PROCESS_INFO, - [current_stacktrace, initial_call, dictionary, message_queue_len, - links, monitors, monitored_by, heap_size]). + [registered_name, current_stacktrace, initial_call, dictionary, + message_queue_len, links, monitors, monitored_by, heap_size]). --export([maybe_stuck/0, maybe_stuck/1]). +-export([maybe_stuck/0, maybe_stuck/1, top_memory_use/0, top_memory_use/1, + top_binary_refs/0, top_binary_refs/1]). maybe_stuck() -> maybe_stuck(5000). @@ -75,5 +76,32 @@ maybe_stuck_stacktrace({_M, F, _A}) -> _ -> false end. +top_memory_use() -> top_memory_use(30). + +top_memory_use(Count) -> + Pids = processes(), + io:format("Memory use: top ~p of ~p processes.~n", [Count, length(Pids)]), + Procs = [{catch process_info(Pid, memory), catch info(Pid)} || Pid <- Pids], + Sorted = lists:sublist(lists:reverse(lists:sort(Procs)), Count), + io:format("~p~n", [Sorted]). + +top_binary_refs() -> top_binary_refs(30). + +top_binary_refs(Count) -> + Pids = processes(), + io:format("Binary refs: top ~p of ~p processes.~n", [Count, length(Pids)]), + Procs = [{binary_refs(Pid), catch info(Pid)} || Pid <- Pids], + Sorted = lists:sublist(lists:reverse(lists:sort(Procs)), Count), + io:format("~p~n", [Sorted]). + +binary_refs(Pid) -> + Refs = try + {binary, Rs} = process_info(Pid, binary), + Rs + catch _:badarg -> [] + end, + lists:sum([Sz || {_Ptr, Sz} <- lists:usort([{Ptr, Sz} || + {Ptr, Sz, _Cnt} <- Refs])]). + info(Pid) -> [{pid, Pid} | process_info(Pid, ?PROCESS_INFO)]. |