erlang学习笔记

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, 这是易错点。

猜你喜欢

转载自blog.csdn.net/weixin_39061247/article/details/80497508