`
轮回记忆
  • 浏览: 10562 次
  • 性别: Icon_minigender_1
  • 来自: 广州
最近访客 更多访客>>
社区版块
存档分类
最新评论

Erlang Tips

阅读更多
转载请注明:来自http://blog.csdn.net/skyman_2001

一、ets
1. ets效率建议(原文出处:http://pro.it165.net/html/201110/950.html)

(1) ets表的底层是由哈希表实现的,不过有序集例外,它是由平衡二叉树实现的。 所以不管是插入还是查找,集合的效率要比有序集高.

(2) 可重复袋要比袋的效率要高, 因为袋要和原来的记录比较是否有相同的记录已经插入. 如果一份大数据,相同的记录越多,袋的效率就越慢.

(3) 一张ets表是由创建它的进程所拥有, 当此进程调用ets:delete或者进程挂了的时候, 表会被删除.

(4) 一般情况下, 插入一个元组到一张ets表中, 所有代表这个元组的结构都会被从进程的栈和堆中,复制到ets表中; 当查找一条记录时, 结果元组从ets表中复制到进程的栈和堆中。

但是大型二进制(large binaries) 数据却不是这样! 它们被存入自已所拥有的堆区域(off-heap area)中。这个区域可以被多个进程,ets表,和独立二进制数据所共享。它由引用计数的垃圾回收策略管理, 这个策略会跟踪到底有多少个进程/ets表/二进制数据引用了这个大型二进制数据. 如果引用数为0的话, 此大型二进制数据就会被垃圾回收掉.

看起来很和复杂, 实际结论就是: 两进程间发消息用大型二进制数据消耗很低, 往ets表插入元组用二进制数据也很划算。我们应该尽可能采用二进制数据来实现字符串或无类型的大数据块.

2. 原文出处:http://www.cnblogs.com/me-sa/archive/2011/08/11/erlang0007.html

(1) ETS查询时间是常量,例外是如果使用ordered_set查询时间与logN成正比(N为存储的数据量)
(2) ETS 存储数据的格式是Tuple
(3) ETS Table由进程创建,进程销毁ETS Table也随着销毁,在使用Shell做ETS实验的时候要注意一下,Table的拥有关系可以give_away 转交给其它进程
(4) 一个Erlang节点的ETS表的数量是有限制的,默认是1400个表,在启动erlang节点之前修改 ERL_MAX_ETS_TABLES参数可以修改这个限制
(5) 目前版本,insert和lookup操作都会导致对象副本的创建,insert和lookup时间对于set bag duplicate_bag都是常量值与表大小无关.
(6) 并发控制:所有针对一个对象的更新都被保证是原子的、隔离的:修改要么全部成功要么失败。也没有其它的中间结果被其它的进程使用。有些方法可以在处理多个对象的时候保证这种原子性和隔离性。
在数据库术语中隔离级别被称作序列化,就好像所有隔离的操作一个接一个严格按照顺序执行。
(7) 在遍历过程中,可以使用safe_fixtable来保证遍历过程中不出现错误,所有数据项只被访问一遍.用到逐一遍历的场景就很少,使用safe_fixtable的情景就更少。不过这个机制是非常有用的,
还记得在.net中版本中很麻烦的一件事情就是遍历在线玩家用户列表.由于玩家登录退出的变化,这里的异常几乎是不可避免的.select match内部实现的时候都会使用safe_fixtable

3. 选用建议(原文出处:http://erlangdisplay.iteye.com/blog/374167)
元素个数0~100个,选list

元素个数 100~10000个,选ets

元素个数10000个以上,选gb_tree

4. 查看节点的当前ets表数量

length(ets:all()).

5. http://erlang.2086793.n4.nabble.com/Is-ets-insert-2-with-multiple-objects-isolated-with-respect-to-concurrent-readers-td2116353.html

the implementation (R13B01) of ets:insert/2
takes a table lock if the second argument is a non-empty
list in order to ensure atomicity.

6. http://erlang.2086793.n4.nabble.com/Preventing-a-race-condition-when-using-dets-ets-td2105529.html

As from R12B-2, one call to ets:update_counter/3 can update several
integer-counters within the same ets-object.

ets:insert(Tab,{key,Done,LeftToDo}).
:
ets:update_counter(Tab,key,[{2,1},{3,-1}]).

7. ETS bag performance characteristics: http://erlang.org/pipermail/erlang-questions/2011-October/061706.html

All ETS tables, except ordered_set, are hash tables with separate
chaining to resolve collisions.

On average constant time for insert/lookup/removal of scattered keys. A
bag with lots of identical keys
may give bad performance as that will result in linear searches between
objects with the same key
(and others that happen to hash to the same bucket).

ordered_set is implented as a binary AVL tree.



二、Shell

1.  在shell中打开Erlang工具集界面:toolbar:start();

2. 显示全部数据:rp();

3. regs()     -- information about registered processes
    nregs()    -- information about all registered processes

4. 查看VM资源信息:按Ctrl+C,然后按i,显示的内容见下:

void info(int to, void *to_arg)
{
    erts_memory(&to, to_arg, NULL, THE_NON_VALUE);
    atom_info(to, to_arg);
    module_info(to, to_arg);
    export_info(to, to_arg);
    register_info(to, to_arg);
    erts_fun_info(to, to_arg);
    erts_node_table_info(to, to_arg);
    erts_dist_table_info(to, to_arg);
    erts_allocated_areas(&to, to_arg, NULL);
    erts_allocator_info(to, to_arg);
}

5. 产生crashdump(运行期快照):先按Ctrl+C,再按大写A。摘自:http://blog.yufeng.info/archives/1847

    用kill -USR1 erlpid或kill -s SIGUSR1 erlpid杀掉erlpid进程,erlang会生成crashdump


三、如何自己生成pid?

    方法1:Pid = list_to_pid("<0.36.0>").

    方法2:Pid = pid(0, 36, 0).

四、

让Erlang服务器后台运行:1. -noshell (该参数关闭终端,但依然不会后台运行,有输出时会直接打印到当前屏幕;2. -noinput 禁止终端下的输入 3. -hidden 隐藏运行;4. -detached 后台方式运行。最好用的是-detached,等效于同时带-noshell和-noinput参数(用ps -ef|grep beam查看便知)。

五、

如何连接detached模式的erlang节点?方法: 通过远程shell JCL登录,1.启动一个erlang节点:erl -name bar@192.168.1.103 -setcookie abc 2. Ctrl+G进入shell JCL,然后远程连接detached模式的erlang:--> r 'foo@192.168.1.103' --> c Eshell V5.7.1 (abort with ^G) (foo@192.168.1.103)1> 详见:http://cryolite.iteye.com/blog/383927

六、

如果shell一直在刷信息,如何终止shell?方法:按Ctrl+G,然后按q退出shell。另外,按h可以显示帮助信息。

七、调度

1. http://blog.yufeng.info/archives/336

port是和进程一样公平调度的.  进程是按照reductions为单位调度的, port是把发送的字节数折合成reductions.  所以如果一个进程发送大量的tcp数据 那么这个进程不是一直会得到执行的. 运行期会强制停止一段时间, 让其他port有机会执行的。

八、binary & bitstring

1. binary和bitstring的区别:位数能被8整除的bitstring是binary。

九、erlang beam执行是加载的流程(ERTS; code-server; dynamically loading of code):
http://erlang.2086793.n4.nabble.com/erlang-questions-ERTS-code-server-dynamically-loading-of-code-td2091745.html

When a function can not be found, a function in the module error_handler
is called in the context of the process wishing to execute the
non-existing function. The code in the error_handler communicated with
the code_server process (implemeneted in code) which implements the
dynamic code loading. Read those modules and you will understand.



十、Supervisor

Supervisor的最大重启次数是针对该supervisor下的所有被监控进程重启次数的总和,允许的次数是包含最大次数的。

十一、进程相关

1. gen_server进程(proc_lib初始化)比直接使用spawn创建的进程会多出一些信息,比如注册名,进程的父进程信息,初始化调用的函数等等:
{dictionary,[{'$ancestors',[<0.34.0>]},
             {'$initial_call',{application_master,init,4}}]}

详见:http://www.cnblogs.com/me-sa/archive/2011/11/22/erlang0017.html

2. 获取进程状态:

  get_status(Name) -> Status
get_status(Name, Timeout) -> Status

Types:
Name = name()
Timeout = timeout()
Status =
    {status, Pid :: pid(), {module, Module :: module()}, [SItem]}
SItem = (PDict :: [{Key :: term(), Value :: term()}])
      | (SysState :: running | suspended)
      | (Parent :: pid())
      | (Dbg :: dbg_opt())
      | (Misc :: term())

Gets the status of the process.

The value of Misc varies for different types of processes. For example, a gen_server process returns the callback module's state, and a gen_fsm process returns information such as its current state name. Callback modules for gen_server and gen_fsm can also customise the value of Misc by exporting aformat_status/2 function that contributes module-specific information; see gen_server:format_status/2 and gen_fsm:format_status/2 for more details.

这样就不需要每个gen_server进程自己写获得State的接口了。

3. 获取进程调用堆栈

erlang:process_info(Pid, current_stacktrace). 格式和erlang:get_stacktrace/0相同,不过erlang:get_stacktrace/0只有在出异常时才能返回调用堆栈,如果无异常,则返回[](不过执行有些erlang库自带函数即使没异常erlang:get_stacktrace/0也会返回调用堆栈,比如执行erl_parse:parse_term())
erlang:process_info(Pid, backtrace).  二进制格式,信息更详细,除了调用堆栈,还包括指令指针等信息
erlang:process_display(Pid, backtrace). 和erlang:process_info(Pid, backtrace)一样,只不过打印格式更方便阅读(shell对应的命令是bt(Pid))


erlang:process_display(Pid, backtrace)和erlang:process_info(Pid, current_function)组合使用可以查看当前进程的函数调用细节。

十二、基础相关

1. atom加单引号和不加单引号是一样的:

5> B1=a.
a
6> B2='a'.
a
7> B1=:=B2.
true

十三、debug相关

1. Debugger工具的详细图文教程:http://www.erlang.org/doc/apps/debugger/debugger_chapter.html

尤其是条件断点

2. Appmon工具对调试进程间相互关系很有帮助

十四、Dialyzer

dialyzer plt building:

$ dialyzer --build_plt \
  --output_plt .dialyzer-R14B01.plt \
  --apps kernel stdlib sasl erts ssl \
    tools os_mon runtime_tools crypto \
    inets xmerl webtool snmp public_key \
    mnesia eunit syntax_tools compiler \
    ./deps/*/ebin

dialyzer analysis:

$ dialyzer ./ebin --plt .dialyzer-R14B01.plt \
  -Wunmatched_returns \
  -Werror_handling \
  -Wrace_conditions \
  -Wbehaviours \
  -Wunderspecs

原文地址:http://bob.ippoli.to/erl_testing_2011/

十五、compile相关

1. erlang编译流程

Source code -> Core Erlang -> Virtual BEAM code -> BEAM bytecode -> Threaded code

           c(mod, to_core)       c(mod, 'S')      erts_debug:df(mod [,fun])

     .hrl, .erl                .core                   .S                         .dis


c(mod, 'S')也可以erlc +”‘S’” mod.erl

参考文章:

(1) A Peek Inside the Erlang Compiler: http://prog21.dadgum.com/127.html

(2) Erlang源码汇编格式: http://blog.yufeng.info/archives/498

(3) 实验Erlang语法对应的opcode 让你对erlang理解更深: http://blog.yufeng.info/archives/34

(4) Erlang Opcodes and their meaning: http://stackoverflow.com/questions/13397434/erlang-opcodes-and-their-meaning
分享到:
评论

相关推荐

    erlang编程 Introducing Erlang

    **Erlang编程:Introducing Erlang** Erlang是一种函数式编程语言,由爱立信在1986年开发,主要用于构建高可用性、容错性和并发性的分布式系统。"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,...

    erlang_版本24.3.4.4

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,主要用于构建高可用性、分布式和实时系统。版本24.3.4.4是Erlang的一个更新版本,包含了对先前版本的改进和修复。Erlang以其强大的错误...

    erlang趣学指南

    Erlang是一门专为构建并发、容错的分布式系统而设计的编程语言,最早由瑞典电信设备公司爱立信所开发。其关键特性包括轻量级进程、消息传递、容错机制以及一个用于构建可靠系统的函数库和中间件,统称为Open Telecom...

    erlang25.0 windows版本

    Erlang是一种高级编程语言,特别适用于并发、分布式和实时系统。它由Ericsson公司开发,主要用于构建高可用性、容错性和可扩展性的软实时系统。Erlang的25.0版本是该语言的一个更新,针对Windows操作系统进行了优化...

    erlang22最新下载包

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson为了实现分布式实时、高可靠性系统而开发。Erlang以其强大的并行处理能力、容错性和易于构建大规模分布式系统的特点,在电信、金融和互联网等...

    Erlang/OTP 26.2.1

    Erlang/OTP 26.2.1,Erlang,OTP,26.2.1

    erlang资源

    这个“erlang资源”包含两本PDF书籍——《Erlang并发编程》和《Erlang入门手册》,它们是深入理解和学习Erlang语言的关键资料。 《Erlang并发编程》这本书可能涵盖了以下知识点: 1. **并发模型**:Erlang的并发...

    ErlangB和ErlangC计算工具(exe可执行文件+excel两个)

    Erlang B和Erlang C是电信领域中两种重要的流量模型,用于预测和分析通信系统中的呼叫处理能力和拥塞情况。这两个模型由丹麦工程师Agner Krarup Erlang在20世纪初提出,至今仍广泛应用于现代通信网络的设计与优化。 ...

    Erlang官网下载过慢

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性和处理大量并发连接的能力而被广泛应用于电信、互联网基础设施和实时系统。RabbitMQ...

    Erlang23_3.zip

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson于1986年开发,主要用于构建高可用性、分布式系统。Erlang的设计目标是支持大量并发连接,容错性强,易于编写实时系统。Erlang采用actor模型...

    erlang-23.2.1-1.el7.x86-64.rpm

    Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ 是用 Erlang 编写的,因此需要 Erlang 运行时。确保安装了兼容的 Erlang 版本;Erlang:RabbitMQ ...

    Erlang 20.3linux安装包

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在IT行业中,Erlang因其强大的实时性、并发性和内存管理机制而被广泛应用于网络通信、数据库系统以及消息中间件,如...

    xiandiao_erlang_Erlang课后习题_

    【Erlang编程语言及其应用】 Erlang是一种并发式、函数式的编程语言,由瑞典电信设备制造商Ericsson开发,最初用于构建高可用性、容错性和可扩展性的分布式系统。"xiandiao_erlang_Erlang课后习题_"这个压缩包文件...

    erlang23.2版windows64位.zip

    Erlang是一种面向并发的、函数式编程语言,由瑞典电信设备制造商Ericsson开发,用于构建高可用性、分布式和实时系统。Erlang因其在处理大量并发连接和容错能力上的优秀表现,广泛应用于电信、银行、互联网服务等领域...

    Erlang B公式计算器

    Erlang B公式是通信网络领域中用于计算呼叫阻塞概率的重要工具,它在电路交换系统,特别是电话交换网络的设计中发挥着关键作用。这个压缩包包含了一个基于Erlang B公式的计算器程序,以及其源代码和实验报告,旨在...

    erlang9.rar

    Erlang是一种高级编程语言,特别适用于并发、分布式和实时计算系统。它的设计目标是创建一个高可用性、容错性强、低延迟的系统。Erlang9指的是Erlang/OTP(Open Telephony Platform)的第9个主要版本。OTP是Erlang...

    erlang安装包.zip

    erlang安装包

    erlang otp25 win安装包

    erlang otp25 win安装包

    windows下安装Erlang环境

    Erlang是一种强大的编程语言,特别适合于构建高并发、分布式和容错性强的系统。由爱立信的CS-Lab开发,Erlang的设计目标是处理大规模并发活动,这在传统的操作系统上可能非常困难。它的核心特性使其在处理并发性、...

    erlang programming

    Erlang是一种面向并发的、函数式编程语言,主要用于构建高度可扩展的、容错性强的分布式系统。在“erlang programming”这个主题下,我们可以深入探讨以下几个关键知识点: 1. **Erlang语言基础**:Erlang是瑞典...

Global site tag (gtag.js) - Google Analytics