-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathmem_analysis
executable file
·85 lines (77 loc) · 3.67 KB
/
mem_analysis
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
#!/usr/bin/env escript
%% -*- erlang -*-
%%! -smp enable -sname mem_analyzer
%%
% Analyzer to process output file of common/meminfo.erl,
% which should be pre-processed by command:
% sed s/"<[0-9]*.[0-9]*.[0-9]*>"/pidxxx/
%%
-export([main/1, destruct/1]).
main( [] ) ->
io:format("No arguments.~n",[]);
main( Args ) ->
io:format("Got Args: ~p~n",[Args]),
Filename = [Args],
{ok, Terms}=file:consult(Filename),
{ok, F} = file:open(Filename++".out", write),
file:write(F, destruct(Terms)),
file:close(F).
%% io:format("~p~n", [Terms]).
destruct(Terms) ->
BuildNames =
fun(Names) ->
string:join(lists:map(fun erlang:atom_to_list/1, lists:reverse(Names)), "_")
end,
Record2Plist1 =
fun Record2PlistFun(Atom, _Names, Acc)
when is_atom(Atom) ->
Acc;
Record2PlistFun(Number, Names, Acc)
when is_integer(Number) ; is_float(Number) ->
[{ BuildNames(Names), Number} | Acc];
Record2PlistFun(Record, _Names, Acc)
when is_tuple(Record) , element(1,Record) == versions ->
Acc;
Record2PlistFun(Record, _Names, Acc)
when is_tuple(Record) , element(1,Record) == name ->
Acc;
Record2PlistFun(Record, Names, Acc)
when is_tuple(Record) , is_atom(element(1,Record)) ->
Name = element(1,Record) ,
lists:foldl(
fun(I, AccInner) ->
NewNames = [list_to_atom(integer_to_list(I)), Name | Names],
NewElement = erlang:element(I + 1, Record),
Record2PlistFun(NewElement, NewNames, AccInner)
end, Acc, lists:seq(1, erlang:size(Record) - 1));
Record2PlistFun(List, Names, Acc)
when is_list(List) ->
lists:foldl(
fun(Elt, AccInner) ->
Record2PlistFun(Elt, Names, AccInner)
end, Acc, List)
end,
Results =
lists:flatmap(fun({system_memory_data, _T, Info}) ->
Record2Plist1(Info, [system, memory], []);
({alloc_info_mseg_alloc, _T, [{erts_mmap, Info} | Detail]}) ->
[Record2Plist1(Info, [erts_mmap, mseg_alloc], [])
| lists:flatmap(fun({instance, N, InfoI}) ->
Record2Plist1(InfoI, [list_to_atom("i" ++ integer_to_list(N)), mseg_alloc], [])
end, Detail)];
({alloc_info_eheap_alloc, _T, [{instance, _, _} | _] = InstanceInfo}) ->
lists:flatmap(fun({instance, N, Info}) ->
Record2Plist1(Info, [list_to_atom("i" ++ integer_to_list(N)), eheap_alloc], [])
end, InstanceInfo);
({alloc_info_binary_alloc, _T, [{instance, _, _} | _] = InstanceInfo}) ->
lists:flatmap(fun({instance, N, Info}) ->
Record2Plist1(Info, [list_to_atom("i" ++ integer_to_list(N)), binary_alloc], [])
end, InstanceInfo);
({_Other, _T, _Info}) ->
[]
end, Terms),
lists:map(fun([{Name, Value}]) ->
io_lib:format("~s ~p~n", [Name, Value]);
({Name, Value}) ->
io_lib:format("~s ~p~n", [Name, Value])
end, Results).