erlang 随手记
erlang进程数量
(a@localhost)12>erlang:length(erlang:processes()).
42
(a@localhost)13>
erlang内存使用情况
(a@localhost)11> erlang:memory().
[{total,20257328},
{processes,6017000},
{processes_used,6016776},
{system,14240328},
{atom,331249},
{atom_used,302818},
{binary,98104},
{code,8111152},
{ets,438096}]
(a@localhost)12>
查看erlang进程的消息队列排名,内存排名,前5名
内存:
(a@localhost)25> lists:sublist(lists:reverse(lists:sort(lists:map(fun(P)->case erlang:process_info(P,memory) of {_,M} -> {M,P}; _->{0,P} end end,processes()))),5).
[{831280,<0.25.0>},
{426448,<0.31.0>},
{263856,<0.80.0>},
{263792,<0.3.0>},
{263752,<0.96.0>}]
(a@localhost)26>
消息队列:
(a@localhost)26> lists:sublist(lists:reverse(lists:sort(lists:map(fun(P)->case erlang:process_info(P,message_queue_len) of {_,MQ} -> {MQ,P}; _->{0,P} end end,processes()))),5).
[{0,<0.96.0>},
{0,<0.80.0>},
{0,<0.79.0>},
{0,<0.78.0>},
{0,<0.77.0>}]
(a@localhost)27>
用代码检测base64:encode的效率
(a@localhost)20> F2 = fun(C)-> A = crypto:rand_bytes(100*1024), T1=now(),lists:map(fun(_)-> catch base64:encode(A) end, lists:seq(1,C)),T2=now(),io:format("~p time use ~.2f ms ~n",[C,timer:now_diff(T2,T1)/1000]) end.
#Fun<erl_eval.6.90072148>
(a@localhost)22> F2(10).
10 time use 166.91 ms
ok
(a@localhost)23> F2(100).
100 time use 1612.59 ms
ok
(a@localhost)24> F2(1000).
1000 time use 16845.46 ms
ok
如何用kill取dump文件和如何查看dump文件
kill -s USR1 $pid
查看dump文件操作,
(bb@lghdeMacBook)1> webtool:start().
WebTool is available at http://localhost:8888/
Or http://127.0.0.1:8888/
{ok,<0.42.0>}
(bb@lghdeMacBook)2>
根据url在ie上打开,录入dump文件
对core文件的操作:
dbx /opt/freeware/lib/erlang/erts-5.9/bin/beam.smp /var/www/apps/cib/core_test/core
erlang节点相关操作:
启动widows的shell 输入
erl -sname Nodename (-setcookie COOKIENAME )同时设置cookie名
PS:其中节点名必须满足erlang原子类型
(1)net_adm:ping(otherNode) pong表示成功,pang表示失败。
(2)auth:get_cookie() 获取cookie
(3)auth:set_cookie(node(),'myselfcookie') 修改cookie
(4)nodes()查看节点
(5)rpc:call(OtherNodeName, Mod, Func, [Arg1, Arg2, ...]) 在Node上执行一个远程调用。
例:rpc:call('b@cib23219',ets,i,[]).
子父进程有趣之处:
parent() ->
Pid = self(),
% spawn(fun() -> child(self()) end). **--- 1**
spawn(fun() -> child(Pid) end). **--- 2**
child(P) ->
io:format("Parent Pid is = ~p,myself pid is = ~p~n",[P, self()]).
PS: 标注的代码段1和代码段2输出的结果不一样, 代码段1输出的是子进程的PID, 代码段2输出的是父进程的PID, 这是易错点。