- 浏览: 982762 次
- 性别:
- 来自: 广州
最新评论
-
qingchuwudi:
有用,非常感谢!
erlang进程的优先级 -
zfjdiamond:
你好 这条命令 在那里输入??
你们有yum 我有LuaRocks -
simsunny22:
这个是在linux下运行的吧,在window下怎么运行escr ...
escript的高级特性 -
mozhenghua:
http://www.erlang.org/doc/apps/ ...
mnesia 分布协调的几个细节 -
fxltsbl:
A new record of 108000 HTTP req ...
Haproxy 1.4-dev2: barrier of 100k HTTP req/s crossed
Erlang系统在我看来有3个特性 1. 分布 2. 多核心支持 3. fp。 这这3个特性中分布我认为是erlang最强大的,从第一个版本就支持到现在,相对非常成熟,而多核心支持是这几年才加进去的。
erlang的分布系统做到了2点 1.节点的位置无关性。 2. 对用户分布式透明的。具体体现就是node是靠名字识别的, 进程也是靠pid来识别。
分布系统就要实现节点间通讯,erlang也不列外。 erlang的节点通讯介质是可以替换的 目前官方版本支持tcp, ssl通讯。
可以用 -proto_dist xxxx来选择通道。 目前支持inet_ssl inet_tcp 用户很容易模仿这这2个通讯协议,写个自己的传输通道,就是要求这个通道是可靠的,不能丢失信息。
这几个实现防火墙友好:
{inet_dist_use_interface, ip_address()}
If the host of an Erlang node has several network interfaces, this parameter specifies which one to listen on. See inet(3) for the type definition of ip_address().
{inet_dist_listen_min, First}
See below.
{inet_dist_listen_max, Last}
Define the First..Last port range for the listener socket of a distributed Erlang node.
erlang的内核里面和分布相关的erl模块主要有net_kernel inet_tcp_dist inet_ssl_dist inet_tcp dist_util erlang(trap send/link等语义)。
当用户运行erl -sname xxxxx启动erlang系统的时候 kernel模块就会启动net_kernel和epmd模块。
epmd的作用是提供一个node名称到监听地址端口的映射。epmd值守在知名端口4369上.
net_kernel会启动proto_dist比如说inet_tcp_dist监听端口,同时把端口报到epmd. 这时候erts就准备好了节点通讯。
这时候另外一个节点要和我们通讯的时候,首先要连接,流程大概是这样的:
1. 根据节点名找到节点地址。
2. 查询节点的4369端口,也就是epmd,向它要节点对应的inet_tcp_dist监听的端口。
3. 发起连接, 握手,cookie认证,如果未授权就失败。
4. 记录节点名称和响应的信息。
所以节点要正常通讯要考虑到firewall和nat的影响,以及cookie正常。
具体的可以看另外一篇文章:http://mryufeng.iteye.com/blog/120666
要给节点发消息首先要保证我们和节点联系过,也就是说我们的节点表里可以查到这个节点。
net_kernel要节点的可用性, 会定期发tick消息坚持节点的可达。对端节点也会主动发送nodeup,nodeup等消息,协助维护。
net_ticktime = TickTime
Specifies the net_kernel tick time. TickTime is given in seconds. Once every TickTime/4 second, all connected nodes are ticked (if anything else has been written to a node) and if nothing has been received from another node within the last four (4) tick times that node is considered to be down. This ensures that nodes which are not responding, for reasons such as hardware errors, are considered to be down.
节点有2种类型可见的和不可见的。erlang节点是可见的, c_interface写的节点不可见,因为c模块提供的节点能力有限。
erlang进程见通讯可以通过 1. pid 2.进程名称 来进行。 erlang系统很大的威力就在用elang实现了名称和pid的全局性维护。也就是说erlang做了个相当复杂的模块来解决名称失效 重复 查询功能。正常情况下名称是全局行的,也就是erlang的节点是全联通的,可以通过来调整。
auto_connect = Value
Specifies when no will be automatically connected. If this parameter is not specified, a node is always automatically connected, e.g when a message is to be sent to that node. Value is one of:
never
Connections are never automatically connected, they must be explicitly connected. See net_kernel(3).
once
Connections will be established automatically, but only once per node. If a node goes down, it must thereafter be explicitly connected. See net_kernel(3).
erlang实现透明进程通信的关键点在于pid的变换:
pid {X,Y,Z} 在发到网络的时候发出去的格式是{sysname, Y, Z}
因为节点之前互相联系过 所以互相知道对方的sysname, 而且sysname在dist_entry里保存,当对端收到dec_pid的时候,用peer sysname 的查到在自己dist_entry里面的索引,然后用这个index 来构造新的pid,即 {index, Y, Z}。
erlang给一个pid发消息的时候, 首先检查Pid是本地的还是外部的, 如果是外部的,则进行上面的变换,然后通过inet_tcp_dist模块,沿着inet_tcp, inet_drv这条线发送出去。
这条消息到达对端的时候 inet_drv首先受到这条消息, 照理说应该提交给inet_tcp, 然后再到inet_tcp_dist, net_kernel来处理.但是erlang为了效率的考虑做了个折中。在inet_drv里面driver_output*中检查消息的类型 如果是dist来的消息,就给erts_net_message来处理。
这个erts_net_message处理以下几个重要消息:
#define DOP_SEND 2
#define DOP_EXIT 3
#define DOP_UNLINK 4
#define DOP_NODE_LINK 5
#define DOP_REG_SEND 6
#define DOP_GROUP_LEADER 7
#define DOP_EXIT2 8
#define DOP_SEND_TT 12
#define DOP_EXIT_TT 13
#define DOP_REG_SEND_TT 16
#define DOP_EXIT2_TT 18
#define DOP_MONITOR_P 19
#define DOP_DEMONITOR_P 20
#define DOP_MONITOR_P_EXIT 21
如果是DOP_SEND的话,就把message放到变换好的进程的队列中去。
这个核心的功能,由beam的c模块(dist.c, erl_node_tables.c, io.c )和net_kernel模块一起实现。然后在这底层的原语上进一步实现了如rpc 这样的上层模块,进一步方便了用户.
用erlsnoop http://mryufeng.iteye.com/blog/167695 可以观察到上面的通讯,有助于理解系统的运作。
erlang的分布系统做到了2点 1.节点的位置无关性。 2. 对用户分布式透明的。具体体现就是node是靠名字识别的, 进程也是靠pid来识别。
分布系统就要实现节点间通讯,erlang也不列外。 erlang的节点通讯介质是可以替换的 目前官方版本支持tcp, ssl通讯。
可以用 -proto_dist xxxx来选择通道。 目前支持inet_ssl inet_tcp 用户很容易模仿这这2个通讯协议,写个自己的传输通道,就是要求这个通道是可靠的,不能丢失信息。
这几个实现防火墙友好:
{inet_dist_use_interface, ip_address()}
If the host of an Erlang node has several network interfaces, this parameter specifies which one to listen on. See inet(3) for the type definition of ip_address().
{inet_dist_listen_min, First}
See below.
{inet_dist_listen_max, Last}
Define the First..Last port range for the listener socket of a distributed Erlang node.
erlang的内核里面和分布相关的erl模块主要有net_kernel inet_tcp_dist inet_ssl_dist inet_tcp dist_util erlang(trap send/link等语义)。
当用户运行erl -sname xxxxx启动erlang系统的时候 kernel模块就会启动net_kernel和epmd模块。
epmd的作用是提供一个node名称到监听地址端口的映射。epmd值守在知名端口4369上.
net_kernel会启动proto_dist比如说inet_tcp_dist监听端口,同时把端口报到epmd. 这时候erts就准备好了节点通讯。
这时候另外一个节点要和我们通讯的时候,首先要连接,流程大概是这样的:
1. 根据节点名找到节点地址。
2. 查询节点的4369端口,也就是epmd,向它要节点对应的inet_tcp_dist监听的端口。
3. 发起连接, 握手,cookie认证,如果未授权就失败。
4. 记录节点名称和响应的信息。
所以节点要正常通讯要考虑到firewall和nat的影响,以及cookie正常。
具体的可以看另外一篇文章:http://mryufeng.iteye.com/blog/120666
要给节点发消息首先要保证我们和节点联系过,也就是说我们的节点表里可以查到这个节点。
net_kernel要节点的可用性, 会定期发tick消息坚持节点的可达。对端节点也会主动发送nodeup,nodeup等消息,协助维护。
net_ticktime = TickTime
Specifies the net_kernel tick time. TickTime is given in seconds. Once every TickTime/4 second, all connected nodes are ticked (if anything else has been written to a node) and if nothing has been received from another node within the last four (4) tick times that node is considered to be down. This ensures that nodes which are not responding, for reasons such as hardware errors, are considered to be down.
节点有2种类型可见的和不可见的。erlang节点是可见的, c_interface写的节点不可见,因为c模块提供的节点能力有限。
erlang进程见通讯可以通过 1. pid 2.进程名称 来进行。 erlang系统很大的威力就在用elang实现了名称和pid的全局性维护。也就是说erlang做了个相当复杂的模块来解决名称失效 重复 查询功能。正常情况下名称是全局行的,也就是erlang的节点是全联通的,可以通过来调整。
auto_connect = Value
Specifies when no will be automatically connected. If this parameter is not specified, a node is always automatically connected, e.g when a message is to be sent to that node. Value is one of:
never
Connections are never automatically connected, they must be explicitly connected. See net_kernel(3).
once
Connections will be established automatically, but only once per node. If a node goes down, it must thereafter be explicitly connected. See net_kernel(3).
erlang实现透明进程通信的关键点在于pid的变换:
pid {X,Y,Z} 在发到网络的时候发出去的格式是{sysname, Y, Z}
因为节点之前互相联系过 所以互相知道对方的sysname, 而且sysname在dist_entry里保存,当对端收到dec_pid的时候,用peer sysname 的查到在自己dist_entry里面的索引,然后用这个index 来构造新的pid,即 {index, Y, Z}。
erlang给一个pid发消息的时候, 首先检查Pid是本地的还是外部的, 如果是外部的,则进行上面的变换,然后通过inet_tcp_dist模块,沿着inet_tcp, inet_drv这条线发送出去。
这条消息到达对端的时候 inet_drv首先受到这条消息, 照理说应该提交给inet_tcp, 然后再到inet_tcp_dist, net_kernel来处理.但是erlang为了效率的考虑做了个折中。在inet_drv里面driver_output*中检查消息的类型 如果是dist来的消息,就给erts_net_message来处理。
这个erts_net_message处理以下几个重要消息:
#define DOP_SEND 2
#define DOP_EXIT 3
#define DOP_UNLINK 4
#define DOP_NODE_LINK 5
#define DOP_REG_SEND 6
#define DOP_GROUP_LEADER 7
#define DOP_EXIT2 8
#define DOP_SEND_TT 12
#define DOP_EXIT_TT 13
#define DOP_REG_SEND_TT 16
#define DOP_EXIT2_TT 18
#define DOP_MONITOR_P 19
#define DOP_DEMONITOR_P 20
#define DOP_MONITOR_P_EXIT 21
如果是DOP_SEND的话,就把message放到变换好的进程的队列中去。
这个核心的功能,由beam的c模块(dist.c, erl_node_tables.c, io.c )和net_kernel模块一起实现。然后在这底层的原语上进一步实现了如rpc 这样的上层模块,进一步方便了用户.
用erlsnoop http://mryufeng.iteye.com/blog/167695 可以观察到上面的通讯,有助于理解系统的运作。
评论
14 楼
mryufeng
2009-04-18
重新启动后PID的creation字段会不同
13 楼
yeshucheng
2008-12-17
感觉网易的游戏底层有在用,呵呵。
12 楼
mryufeng
2008-12-10
就我所知好多家公司用它做游戏平台
11 楼
dingjun123
2008-12-10
肯定有,不过很少!!看过erlang好像是老家伙,后来火了,就像ajax早就有了,web2.0把它给搞火了
10 楼
javavsnet
2008-12-10
中国有用Erlang做开发的公司么?
9 楼
mryufeng
2008-12-09
这样的话是可能的。
8 楼
xvyu
2008-12-09
重新看了下,那个问题是一个节点崩溃后,重新启动产生的进程id和原来相同。
这个问题的详细描述是在erlang-china提供的一篇文章《编写分布式的erlang程序:陷阱和对策》的4.1节。
这个问题的详细描述是在erlang-china提供的一篇文章《编写分布式的erlang程序:陷阱和对策》的4.1节。
7 楼
mryufeng
2008-12-09
那不是bug,正常的,pid到另外一台机器以后会变换的,肯定不重复。X,Y,Z 中的本机X是0,区别于外来的PID.
6 楼
xvyu
2008-12-09
erlang好像有个bug,在不同机器上的节点可能会产生有相同pid的进程。
5 楼
mryufeng
2008-12-09
比lighty要差些。 因为erlang是opcode执行的,要比lighty的c慢, 但是架构上的优势可以补偿不少,特别是机器比较高档的话,但是版本升级,稳定度,监控和日志什么的,lighty就没有优势。
4 楼
ahuaxuan
2008-12-09
从erlang的这3个特性看来,是不是可以说,用erlang开发一个webserver在多核的情况下性能会比较的高呢,如果用它开发一个webserver,它的性能和lighttpd比会如何(假设开发者水平相当)
在多核的机器上:
如果说erlang比lighttpd慢,那是否能说明erlang只是是在性能和速度上做出的一个平衡
如果erlang比lighttpd快,那我觉得确实erlang在多核上有优势.
在多核的机器上:
如果说erlang比lighttpd慢,那是否能说明erlang只是是在性能和速度上做出的一个平衡
如果erlang比lighttpd快,那我觉得确实erlang在多核上有优势.
3 楼
mryufeng
2008-12-09
主要是底层关注的人比较少 但是用到的时候比较威力
2 楼
sw2wolf
2008-12-09
多写点好啊! 这版太冷清了
1 楼
dogstar
2008-12-07
大哥最近发威了,一口气写了这么多blog?是erlang group III的ppt内容吧?哈哈
发表评论
-
OTP R14A今天发布了
2010-06-17 14:36 2677以下是这次发布的亮点,没有太大的性能改进, 主要是修理了很多B ... -
R14A实现了EEP31,添加了binary模块
2010-05-21 15:15 3032Erlang的binary数据结构非常强大,而且偏向底层,在作 ... -
如何查看节点的可用句柄数目和已用句柄数
2010-04-08 03:31 4816很多同学在使用erlang的过程中, 碰到了很奇怪的问题, 后 ... -
获取Erlang系统信息的代码片段
2010-04-06 21:49 3479从lib/megaco/src/tcp/megaco_tcp_ ... -
iolist跟list有什么区别?
2010-04-06 20:30 6530看到erlang-china.org上有个 ... -
erlang:send_after和erlang:start_timer的使用解释
2010-04-06 18:31 8390前段时间arksea 同学提出这个问题, 因为文档里面写的很不 ... -
Latest news from the Erlang/OTP team at Ericsson 2010
2010-04-05 19:23 2013参考Talk http://www.erlang-factor ... -
对try 异常 运行的疑问,为什么出现两种结果
2010-04-05 19:22 2843郎咸武<langxianzhe@163.com> ... -
Erlang ERTS Async基础设施
2010-03-19 00:03 2521其实Erts的Async做的很不错的, 相当的完备, 性能又高 ... -
CloudI 0.0.9 Released, A Cloud as an Interface
2010-03-09 22:32 2477基于Erlang的云平台 看了下代码 质量还是不错的 完成了不 ... -
Memory matters - even in Erlang (再次说明了了解内存如何工作的必要性)
2010-03-09 20:26 3443原文地址:http://www.lshift.net/blog ... -
Some simple examples of using Erlang’s XPath implementation
2010-03-08 23:30 2052原文地址 http://www.lshift.net/blog ... -
lcnt 环境搭建
2010-02-26 16:19 2615抄书:otp_doc_html_R13B04/lib/tool ... -
Erlang强大的代码重构工具 tidier
2010-02-25 16:22 2487Jan 29, 2010 We are very happy ... -
[Feb 24 2010] Erlang/OTP R13B04 has been released
2010-02-25 00:31 1389Erlang/OTP R13B04 has been rele ... -
R13B04 Installation
2010-01-28 10:28 1392R13B04后erlang的源码编译为了考虑移植性,就改变了编 ... -
Running tests
2010-01-19 14:51 1488R13B03以后 OTP的模块加入了大量的测试模块,这些模块都 ... -
R13B04在细化Binary heap
2010-01-14 15:11 1509从github otp的更新日志可以清楚的看到otp R13B ... -
R13B03 binary vheap有助减少binary内存压力
2009-11-29 16:07 1669R13B03 binary vheap有助减少binary内存 ... -
erl_nif 扩展erlang的另外一种方法
2009-11-26 01:02 3220我们知道扩展erl有2种方法, driver和port. 这2 ...
相关推荐
Erlang分布是一种连续概率分布,常用于描述一系列独立同分布的指数随机变量之和,例如呼叫中心等待时间、服务时间等。在MATLAB中,我们可以利用不同的函数或技巧来生成服从Erlang分布的随机数。以下是两种常用的方法...
在MATLAB中,Erlang分布是一种连续概率分布,它常用于表示独立同分布的泊松过程事件发生所需时间的总和。Erlang分布有多个应用,包括排队论、可靠性工程以及寿命分析等领域。本教程是针对本科和硕士级别的教研学习...
Erlang随机变量 ... 如果未提供dims参数,则该函数从Erlang分布返回一个随机抽奖。 var out ; // Set seed random . seed = 2 ; out = random ( 5 ) ; // returns [ ~1.416, ~1.285, ~0.112, ~1.103, ~2.01
"Introducing Erlang"是Simon St. Laurent撰写的一本入门级教程,旨在帮助初学者理解和掌握Erlang的核心概念和特性。 ### 1. 函数式编程基础 Erlang基于函数式编程范式,这意味着程序由纯函数构成,没有副作用。...
**Erlang公式的理解** Erlang是一个在电信领域广泛使用的单位,用来衡量话务量,即通信系统中处理的呼叫流量。Erlang的名字来源于丹麦数学家Agner Krarup Erlang,他在20世纪初研究了电话交换系统的理论。在Erlang...
- **OTP(Open Telephony Platform)**:Erlang的核心库,包含大量预先设计的模块,用于处理常见的系统任务,如错误处理、分布式计算和监控。 - **行为模式**:如GenServer、GenEvent和Gen_fsm,它们定义了Erlang中...
这份报告可能包含了Erlang分布的基本概念、公式解释以及项目的技术实现细节。 “大群化效应演示.exe”这个名字不太符合Erlang计算器的主题,但有可能是与项目相关的辅助程序,用来演示或解释某些与Erlang分布或系统...
在统计学和概率论中,Erlang分布是一种连续概率分布,通常用于排队理论中的服务时间分布,以及网络通信等领域。Erlang分布是伽玛分布的一个特例,当伽玛分布的形状参数为正整数时,就是Erlang分布。在给出的文件内容...
分布矩生成函数(MGF)。 随机变量的为 对于t < lambda> 0是分布的速率参数。 在t >= lambda的情况下,未定义MGF,并且此模块返回NaN 。 安装 $ npm install distributions-erlang-mgf 要在浏览器中使用,请使用...
学习Erlang时,你需要掌握以下核心概念: - **BEAM虚拟机**:Erlang的运行时系统,全称是BIFs (Built-In Functions)、Erlang、Assembler and Memory管理器。 - **OTP行为**:如Supervisor(监督者)、GenServer...
Erlang分布协议(Erlang Distributed Protocol) - **概念**: Erlang节点之间通信的协议,支持跨节点的进程间通信。 - **格式**: 包含节点标识、消息类型等字段,保证了数据的安全传输。 - **实现**: 通过`net_adm`和...
4. **分布式编程**:Erlang进程可以分布在多个节点上,实现分布式系统的构建。书可能讲解了如何进行节点间通信、分布式数据管理和负载均衡。 5. **模式匹配**:Erlang的函数定义允许模式匹配,使得代码更加简洁和可...
py 是为 Erlang 生态系统准备的分布式 Python。该项目有两个主要特性: Python 的简单封装接口,封装了 ErlPort 调用,可方便的进行: Make module-level calls Get module-level constants Instantiate ...
Erlang语言的核心特点包括轻量级进程(Erlang中的进程与操作系统进程不同,它们更轻便且能快速切换)、模式匹配、函数式编程和热代码替换等。这些特性使得Erlang在处理高并发场景下表现出色,例如在电信、网络设备和...
它的核心特性使其在处理并发性、分布性和实时性方面表现出色。 **并发性**:Erlang的并发模型基于轻量级进程(Lightweight Processes, LWP),这些进程消耗资源极少,使得系统能够同时处理成千上万个并发任务。由于...
对于开发者来说,了解这些更新和变化至关重要,因为它们可能影响到现有项目的行为,或者提供新的工具和技术来解决特定问题。学习和掌握Erlang22的新特性有助于提升开发效率和应用质量,特别是在构建高并发、分布式...
Erlang_CNode用户指南通常会涵盖以下几个核心主题: 1. **安装和配置**:指导用户如何在系统上安装Erlang VM和CNode所需的所有依赖项,包括设置环境变量,确保编译器和链接器正确配置。 2. **创建CNode**:详细...
在压缩包子文件的文件名称列表中,我们看到"otp_win64_23.2.exe",这是一个可执行文件,代表Open Telecom Platform (OTP)的Windows 64位版本,OTP是Erlang生态系统的核心部分,包含了开发、调试和运行Erlang应用程序...
2. **掌握并发编程**:习题可能包含创建和管理Erlang进程、实现进程间的消息传递,帮助学习者理解并发编程的核心概念。 3. **函数式编程思维**:习题可能涉及无副作用函数的编写,以及如何利用函数式编程特性如递归...