- 浏览: 573004 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
JamAndVariousAbalone:
存储方式的不同吧。gb_tree是平衡树,list是线性结构。 ...
gb_trees和lists的访问效率相差很大 -
genesislive:
eporf:analyse()写错了,应该改成eprof:an ...
Erlang程序的性能测试工具(1) -
vampirezh:
高手啊 求带 ! 请列出带徒标准
Erlang的未来(2008) -
aiquantong:
great!
rebar工具使用备忘录 (1) -
wccxiaoan:
basho的资源 都没办法打开,不过还是有帮助,谢谢。
关于webmachine
- receive子句的消息匹配模式:如果消息很简单,使用atom就可以描述的话,没必要使用tuple,tuple会消耗更多的内存,而且减慢了进程的处理速度。
- i()列出当前进程的详细信息,regs()列出所有注册进程和端口的详细信息。ets:i()列出所有ets表的详细信息。
- atom不会被垃圾回收,因此为所有进程都进行注册有可能会耗尽内存。建议只对长生命周期的进程进行注册。
- 给pid发送消息不会有任何错误,哪怕该进程不存在;但是,当注册的进程不存在时,通过注册名给它发消息会出错。
- 进程对接收到的消息不进行处理(匹配)应视为一种bug,因为这些未被处理的消息会不断的在进程的mailbox里堆积,最后引起内存泄露,然后,系统崩溃。mailbox过大的另一个问题是,每次收到新消息,所有的旧消息都要过一遍,从而减缓了进程的处理速度,表现为CPU占用率很高。此外,大容量mailbox的进程还会迟滞那些发消息给它的进程(因为Erlang runtime为了使大容量mailbox的进程能及时进行处理,它会主动放慢那些给这个进程发送消息的进程) 但是,丢弃这些消息又会使调试困难,因此,最好确保在日志中记录下这些不能处理的消息。
- Erlang无法完全避免死锁,例如进程A同步调用进程B(A给B发送消息,然后等待B返回响应消息),后者(B)又同步调用进程A。
- 进程的优先级可以通过调用process_flag(priority, Priority)进行调整,但是不鼓励调整进程的优先级,甚至应该完全禁止使用。
- 进程间的联系有两种,一种是双向的,即link;一种是单向的,即monitor。前者建立的联系是永久的,后者是临时的。前者只能给存在的进程建立联系,后者可以监视不存在的进程(当然会立即收到一个{'DOWN'...,noproc}消息)。显然后者适合用在不对称关系的进程中,例如client-server
- 解除对进程的监视最好调用erlang:demonitor(Reference, [flush]),因为demonitor调用之前监视的进程可能就DOWN掉了。
- 任一进程非正常退出,会给其link的进程集发出exit信号,exit信号将像多米诺骨牌一样传递出去(每张牌就是一个进程,倒掉代表进程被结束)。可以理解成:调用process_flag(trap_exit,true)后,进程将收到的其它进程exit信息转换成{'EXIT', Pid, Reason}消息,从而制止了多米诺骨牌的继续倒掉;
- 进程的正常结束不会引发关注:进程正常退出时,也会给它的直接link set发送exit信号,但这个正常退出信号不会进一步的传播下去,也就是说正常退出信号不会引发多米诺骨牌的倒塌。(设置了trap_exit标志的进程会将这个exit信号转换成消息{'EXIT',Pid,normal})。
- 两个在不同计算机上的link进程,如果它们之间的网络连接断掉了,会收到{'EXIT', Pid, noconnection}的消息
- 大型的Erlang系统中不应该有孤儿进程,也就是说所有的进程都要连接在一棵巨大的supervision树上。孤儿进程有两个问题,首先不容易发现bug:当这些进程因bug当掉时,根本无从知晓。另一个问题是“进程泄漏”,孤儿进程因为某种原因挂了起来,它会一直挂着,随着越来越多的进程挂起,这些不断积累的孤儿进程终将耗尽内存。
- supervisor进程的唯一任务就是启动子进程并监视之。supervisor设置成trap_exit,并link到所有子进程。
- Erlang的在线升级,分两种情况。第一种情况是模块A在进程中运行,A会调用模块B的函数,运行A模块的进程会维持一个到模块B的最新版本的链接(link),在模块B重载后,进程中模块B的链接(link)会切换到最新版本,这样,模块A以后会自动调用更新后的函数。第二种情况是模块A本身的升级,这种正在进程中运行的模块的升级要复杂一些,取决于模块中函数的调用方式:是直接调用,还是fully qualified function call调用(指B:fun1()这样的调用),如果是直接调用,在模块重载后,还是维持旧版本的模块,而 fully qualified函数调用将会立即切换到最新版本的函数。
- Erlang运行时只维持两个版本的模块代码,因此在第2次模块升级后,最老版本的模块会被移除,如果有进程仍然运行最老版本的模块,这些进程将随着最老版本模块的移除而被终止(killed)。
- 有三种装载模块的方法。第一种是直接调用模块中的函数,此时一个叫code server的进程(它是Erlang kernel的一部分)将会搜索相应的beam文件,然后装载之;第二种是编译该模块(相应的函数是compile:file(Module))后会自动装载编译好的模块,在shell中是通过命令c(Module);第三章方式是显式的装载模块,通过调用code:load_file(Module)转载指定的模块,在本机上可以通过命令l(Module)装载模块,在网络中可以通过命令nl(Module)将模块装载到各个节点上。
- Erlang运行时,同一个模块至多维持有两个:旧的和当前的。当又有新的版本装载进来,旧的那个会被清除,当前的变成旧的,刚装载上的成为当前的。其中旧的、当前的模块与该模块实际版本无关,而与装载的时间顺序有关(可能先装载一个最新版本的模块,之后又装载老版本的模块,这种情况下先装载的模块是旧的,后装载的模块是当前的)。
- shell中按tab键会显示所有已装载的模块。
- 调用code:is_loaded(Module)判断模块是否已装载。shell中通过tab键补全特性判断模块是否已装载。
- code server的主要任务是动态的装载和清除模块。通过code模块中的函数可以操作code server,进而对系统代码库进行管理和配置。
- code search path是code server装载模块是的搜索路径,缺省包括当前路径,以及所有库应用的路径。通过code:get_path()查看。
- Erlang根目录:即Erlang安装目录,所有库应用都在根目录的lib目录下,通过code:root_dir()可以查看根目录位置。
- 热升级面临的几个问题:升级步骤原子化;向后兼容以备升级失败;分布式环境中升级的同步化。SASL应用库提供了一些热升级的工具。
- 最简单的热升级是重载模块即可。前提条件是升级不会修改已存在的loop data。
- 既然函数也是一种数据,那么显然,它也可以是tuple的一部分、record的一部分,也可以作为消息进行发送。当然,作为其它函数的返回值也就没什么奇怪的,这样就可以在运行时动态的创建函数了。
- reference数据:在分布式环境中reference数据提供了一个跨进程的唯一标识(tag),它主要用于进行比较,多于消息传递有关。
- 用变量绑定已定义在模块中的函数:Fun1 = fun Module:Function/Arity
- 将函数传递给远程节点时,显然,函数中调用的那些模块必须也在远程节点的code search path中。
- 一个binary是一块无类型的内存的引用。最初被Erlang用来通过网络加载代码,随后就应用在基于socket的通讯中。
- ets的match操作有可能会损害Erlang系统的实时性:这是因为所有的match操作都是作为BIF实现的,而BIF的执行具有原子性,当对较大的ets表进行match操作时要遍历完整个ets表,这就会堵塞其它进程。要避免此类问题最好用first、next遍历ets表,这样做也许会更慢,但至少不会损害系统的实时性。
- 用ets存储record数据要指定key位置,因为作为record的tuple第一个元素总是相同的。
- 一个Erlang节点是指运行中的Erlang运行时系统。一个alive的Erlang节点是指“能够”与其它节点通讯的节点,alive节点必须有名字。调用erlang:is_alive()判断当前节点是否alive。net_kernel模块提供了控制Erlang节点alive的函数。
- alive的Erlang节点名字有两种:短名(short name)和长名(long name),短名节点只能与短名节点通讯,长名节点只能与长名节点通讯。
- Erlang系统的安全理念是:要么完全信任你,要么完全不信任你。因此互联的远程Erlang节点拥有本地节点的所有访问权限。对于互联网上分布的Erlang节点,可以通过SSL加强安全性。
- 节点间的安全是通过cookie控制的,每个节点持有一个被称为secret cookie的atom,持相同cookie的节点间才能进行通信。(home目录下有个“.erlang.cookie”文件,其内容为缺省cookie值。)另外,通过临时设置cookie可以让拥有不同cookie的节点间互通。
- 分布式节点间的互联是通过每个节点上的net_kernel进程实现的,进程的远程启动也是net_kernel负责。net_kernel进程通过cookie进行安全授权。因此用户可以通过修改net_kernel定制自己的安全授权机制。
- 对于有太多Erlang节点的分布式系统,一个问题是会有太多的TCP/IP连接,如果有N个节点,这些阶段彼此联通,会有N * (N - 1) / 2个TCP/IP连接。解决办法是hidden node。
- 通过node(hidden)或node(connected)查看hidden nodes
- hidden node的一个用法是作为“网关”将许多小的分布式机群连接起来。另一个用法是用来做维护,它不会影响流量。
- 通用的消息发送格式是Pid ! Message,给远程注册进程发消息是:{register_name, node} ! Message
- receive的timeout一个麻烦的地方是可能超时后消息又到了,这时消息就会堆积在接收进程的mailbox中,在该进程又一次进入消息接收时,可能处理的是这些超时后堆积的消息,因此进行消息接收之前最好flush一下进程的mailbox。
- monitor_node(RemoteNode, true)用于监控远程节点,当被监控的远程节点当掉时监控进程会收到{nodedown, RemoteNode}消息。
- 查询某个进程(Pid)、某个引用(Reference)或者某个端口(Port)在哪个节点上,可以使用BIF函数node(Arg)。
- epmd是Erlang port mapper deamon的缩写,这是一个操作系统级的守护进程,是Erlang运行时系统的一部分。不管运行了多少Erlang节点,每个计算机只运行一个epmd,它随Erlang节点的第一次启动而启动,不随Erlang节点的结束而结束。epmd负责监听4369端口上的连接请求,然后将其映射给相应节点的监听端口。
- epmd可以作为shell命令单独启动,该命令还带若干参数,可以通过 epmd -help查看。例如可以查看所有erlang节点的占用端口。
- epmd的一个重要用处是通过参数delay_accept和delay_write可以模拟网络繁忙的情况,便于测试。
- 程序员编写的OTP应用(OTP application)是构成Erlang系统的砖石,它在运行时的进程组成一个supervision树。OTP应用本身是一种OTP behavior。
通过优化代码、对OS和Erlang VM精心调试可以纠正此类问题。
另外同步化发送消息的进程是一种办法,发送进程发送一个消息然后等待一个确认会减慢maibox的消息增长速度。同步化的副作用是减少了接收处理进程的最大吞吐量,但至少不会使系统当掉。
发表评论
-
NIF与OS线程
2013-08-31 01:29 1055NIF的OS线程编程模型可以参考The Art of Mult ... -
关于nif
2013-08-19 10:28 4992一、NIF的误用问题 使用NIF是很危险的,一不小心它就会搞 ... -
遇到的riak性能问题
2013-07-23 10:59 23611。 遇到一个奇怪的性能问题,多个进程中用riakc_pb_ ... -
folsom_metrics使用备忘
2013-06-07 15:41 1432folsom是一个通用的统计度量工具。使用很简单,关键是搞清它 ... -
Riak Core与folsom
2012-09-01 11:54 1442folsom是Riak从1.2开始引入。 -
关于Erlang/OTP的application参数配置
2012-08-26 23:27 9037Erlang/OTP中将完成特定功能的一组模块组织起来,称之 ... -
rebar工具使用备忘录 (5)
2012-08-23 18:17 1447haogongju、人人IT网、59n南龙、360doc、as ... -
lager的使用
2012-08-23 15:06 10460haogongju、人人IT网、59n南龙、360doc不要抄 ... -
rebar工具使用备忘录 (4)
2012-08-22 19:20 5567haogongju、人人IT网、59n南龙、360doc、as ... -
rebar工具使用备忘录 (3)
2012-08-22 19:18 1255haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (9) cheatsheet
2012-08-12 12:58 1632haogongju、人人IT网、59n南龙、360doc不要抄 ... -
对Riak Core的探索 (8)
2012-08-11 18:52 1210haogongju、人人IT网、59n南龙、360doc不要抄 ... -
关于webmachine
2012-08-03 14:38 2771haogongju、人人IT网、59n ... -
使用dialyzer遇到的问题
2012-06-19 18:18 11421. 对自定义behaviour的警告 有洁癖的可能无法忍受这 ... -
关于erlang的iolist
2012-06-17 15:10 2777erlang字符串可以用list结构存放ASCII编码(0~2 ... -
关于erlang的binary
2012-06-02 16:03 72661. binary数据是可以在不 ... -
关于erlang的进程池
2012-05-30 18:42 6092有两种情况需要考虑使 ... -
riak对大数据文件或对象的支持问题
2012-05-24 19:24 1534很遗憾在2011年12月的时 ... -
riak资料汇编
2012-04-10 17:38 2487一、上手 各个操作系统平台上的安装说明:Installati ... -
对riak_core的探索 (5)
2012-04-05 17:31 0Coordinator的使用 一份partition有多个副 ...
相关推荐
Erlang Programming 导Erlang Programming 导读.pdf读.pdfErlang Programming 导读.pdf
这是《 Erlang编程语言》的上一页,我们正在处理中,将那里的所有书籍都转换为新页面。 请再次检查此页面!!!
Programming+Erlang.pdf+ 面对软件错误构建可靠的分布式系统.pdf+ Concurrent Programming in ERLANG
Programming Erlang
An overall learning material of Erlang Programing. Suitable for both newbie and experienced developer.
erlang最早应用于电信行业,对于高并发行业也有很重要应用,目前已经在很多聊天软件的服务器开发中使用了
Pragmatic.Programming.Erlang.2nd.Edition
Pragmatic Programmer, Pragmatic Programming, Pragmatic Bookshelf and the linking g device are trademarks of The Pragmatic Programmers, LLC. Every precaution was taken in the preparation of this book.
programming erlang 源码
Erlang is our solution to three problems regarding the development of highly concurrent, distributed “soft real-time systems”: • To be able to develop the software quickly and efficiently • To ...
Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang Joe的那篇erlang论文 efficiecy guide
Joe的那篇erlang论文 Programming Erlang + 源码包 Erlang Programming Concurrent Programming in Erlang efficiecy guide 资源齐全.希望能帮到你.
Concurrent Programming in ERLANG
This book is an in-depth introduction to Erlang, a programming language ideal for any situation where concurrency, fault tolerance, and fast response is essential. Erlang is gaining widespread ...
In this second edition of the bestselling Programming Erlang, you'll learn how to write parallel programs that scale effortlessly on multicore systems. Using Erlang, you'll be surprised at how easy ...
Erlang - Structured Programming Using Processes
Programming Erlang 官方文档
Erlang程序设计中文版 完整书签 erlang programming