相似top命令。查看erlang进程占用cpu、内存较高的进程
html
參数:
node
node atom erlang node
port integer The used port
accumulate boolean If true execution time is accumulated
lines integer Number of displayed processes
interval integer Display update interval in secs
sort runtime | reductions | memory | msg_q
output graphical | text
tracing on | off
setcookie string
使用举例:
web
1. 找出cpu占用最高的进程,图形界面输出,每10秒更新一次
cookie
> spawn(fun() -> etop:start([{interval,10}, {sort, runtime}]) end). > etop:stop().
2. 找出内存占用较高进程, 输出进程的数量为20。文本形式输出app
> spawn(fun() -> etop:start([{output, text}, {lines, 20}, {sort, memory}]) end). > etop:stop().
3. 查看远程节点etop:函数
> erl -name abc@192.168.17.102 -hidden -s etop -output text -sort memory -lines 20 -node 'test@192.168.17.102' -setcookie mycookie123
或者:工具
> erl -name abc@192.168.17.102 -hidden > etop:start([{node,'test@192.168.17.102'}, {setcookie, "mycookie123"}, {output, text}, {lines, 20}, {sort, memory}])
rpc:call
oop
> erl -name abc@192.168.17.102 -setcookie mycookie123 > rpc:call('test@192.168.17.102', etop, start, [[{output, text}, {lines, 20}, {sort, memory}]]).
若是咱们使用etop查到了cpu占用时间较多的进程id。那么可以使用eprof进行进一步的分析.
post
基本使用方法:性能
> eprof:start(). > eprof:profile([pid(x,x,x)]). > eprof:stop_profiling(). > eprof:analyze(). > eprof:stop().
或:
> eprof:start_profiling([regNames], {gen, call, 4}). > eprof:stop_profiling(). > eprof:analyze(). > eprof:stop().
regNames可以填写进程的注冊名, {gen, call, 4}表示仅仅记录gen:call/4这个函数
analyze结果演示样例:
****** Process <0.60.0> -- 100.00 % of profiled time *** FUNCTION CALLS % TIME [uS / CALLS] -------- ----- --- ---- [----------] gen:call/4 2 0.00 0 [ 0.00] gen:do_call/4 2 0.22 1 [ 0.50] gen_server:call/2 2 0.44 2 [ 1.00] dbutil:i_connect/1 2 0.66 3 [ 1.50] gen:call/3 2 0.66 3 [ 1.50] resource_pool:get/1 2 0.66 3 [ 1.50] mvar:modify/2 2 0.66 3 [ 1.50] gen_server:decode_msg/8 4 0.88 4 [ 1.00] erlang:monitor/2 2 0.88 4 [ 2.00] erlang:demonitor/2 2 1.33 6 [ 3.00] gen_server:handle_msg/5 4 1.55 7 [ 1.75] myserver:handle_call/3 4 1.77 8 [ 2.00] gen_server:loop/6 4 1.99 9 [ 2.25] erlang:send/3 2 3.76 17 [ 8.50] gen_server:reply/2 4 84.51 382 [ 95.50]
fprof相似eprof,但是会把具体信息存储到文件里,方便数据统计分析。
仅仅看某一函数的简单调用方法:
1> fprof:apply(Module, fun, Args). 2> fprof:profile(). 3> fprof:analyse().
实际上在运行的时候,fprof:apply/3先后会本身主动加入trace([start, ...]) 和 trace(stop).
完整的写法是:
> fprof:trace([start, {file, "./fprof.trace"}, {procs, PidSpec}]). %% 或者可以trace多个Pid,[PidSpec] > fprof:trace(stop). > fprof:profile({file, "./fprof.trace"}). > fprof:analyse([{dest, "fprof.analysis"},{sort,own}]). %% 具体參数见: http://www.erlang.org/doc/man/fprof.html#analyse-2
结果演示样例:
1> fprof:apply(lists, reverse, ["abcdef"]). "fedcba" 2> fprof:profile(). Reading trace data... End of trace! ok 3> fprof:analyse(). Processing data... Creating output... %% Analysis results: { analysis_options, [{callers, true}, {sort, acc}, {totals, false}, {details, true}]}. % CNT ACC OWN [{ totals, 3, 0.027, 0.027}]. %%% CNT是trace过程当中函数调用的总数,ACC是整个trace的时间,OWN为函数运行时间 % CNT ACC OWN [{ "<0.33.0>", 3,undefined, 0.027}]. %% {[{undefined, 0, 0.027, 0.019}], { {fprof,apply_start_stop,4}, 0, 0.027, 0.019}, % [{{lists,reverse,1}, 1, 0.008, 0.005}, {suspend, 1, 0.000, 0.000}]}. {[{{fprof,apply_start_stop,4}, 1, 0.008, 0.005}], { {lists,reverse,1}, 1, 0.008, 0.005}, % [{{lists,reverse,2}, 1, 0.003, 0.003}]}. {[{{lists,reverse,1}, 1, 0.003, 0.003}], { {lists,reverse,2}, 1, 0.003, 0.003}, % [ ]}. {[ ], { undefined, 0, 0.000, 0.000}, % [{{fprof,apply_start_stop,4}, 0, 0.027, 0.019}]}. {[{{fprof,apply_start_stop,4}, 1, 0.000, 0.000}], { suspend, 1, 0.000, 0.000}, % [ ]}. Done! ok
%是一种标记,每一个“段落”中,%表示被调用的函数主体,%以上为调用它的函数,%下面为它调用的函数。“段落”中的CNT列表示被调用次数。Acc表示包含%之上的函数在内所花费的时间,own表示不包含%之上的函数所用的时间。
suspend表示进程挂起。
也可以将fprof这类工具卸载想监控的代码先后。
用于统计一个函数中的每个函数的调用次数。
相较于eprof和fprof。cprof对性能影响很是小。官方说大约10%
使用举例(引自官网)
1> cprof:start(),R=calendar:day_of_the_week(1896,4,27),cprof:pause(),R. 1 2> cprof:analyse(calendar). {calendar,9, [{{calendar,df,2},1}, {{calendar,dm,1},1}, {{calendar,dy,1},1}, {{calendar,last_day_of_the_month1,2},1}, {{calendar,last_day_of_the_month,2},1}, {{calendar,is_leap_year1,1},1}, {{calendar,is_leap_year,1},1}, {{calendar,day_of_the_week,3},1}, {{calendar,date_to_gregorian_days,3},1}]} 3> cprof:stop(). 3271
该演示样例代表day_of_the_week这个函数需要调用9个函数完毕计算。
相同cprof可以嵌入代码中。
webtool:start(). %% 默认port8888, http://localhost:8888/
appmon:start(). %% 查看application树
pman:start(). %%监控进程
tv:start(). %% ets & mnesia
toolbar:start(). %% 包括了上面几个