`
litaocheng
  • 浏览: 333158 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Erlang进程之错?

阅读更多

前阵子erlang-china关于erlang该不该具有静态特性讨论的如火如荼,期间抛出了一个在erlang开发中迟早会遇到的问题:在一个拥有成千上万并发process的系统中,某些process具有举足轻重的位置,如其记录log信息,提供某个核心查询功能,这样的情况下,无数的进程访问一个进程,导致这个核心进程消息队列异常增大,相应速度下降,timeout接踵而来,最后导致系统当掉。

这样的情况,在其他语言的开发中也会遇到,只是在erlang的世界中,其似乎更加明显,更加值得“批评”。
因为erlang号称是适应“高并发,分布式,大规模系统”,这个小小的应用场景erlang就出了乱子,能不批评么?

Erlang虚拟机调度器中,追求的哲学是每个进程都有均等的拥有资源的能力。

让我们从虚拟机跳到现实社会中来。有一些老大,疯狂的掳夺占有资源,他们认为自己可以利用这些资源做出最有意义的事情。
这样下去可能会导致几个问题:
1)他们真的对了么?
2)小人物没有得到任何资源,难道就要饿死么?
3)老大挂掉了怎么办?资源还能有效的回收么?会不会很麻烦?
这个现实世界的问题,可以简单的映射到erlang的世界,需不需要有特权进程!
现实的世界证明,这个老大是靠不住的,众生皆追求平等自由,所以目标就是让每个人都有各种各样的权力。erlang也是如此。

我曾经跟帖说出三个解决方案:
1,将这个核心进程,复制几份,作为一个整体获取更多的执行机会,更多的io
2,提升进程的优先级别(process_flag(priority, max)),或者降低其他非关键进程的执行机会(yield)
3,将核心进程放入一个独立的node,让它自由的运转

采用了方案1 ,因为其简单,不需要伤筋动骨,不需要系统大的改动,只是封装出一个behaviour,根据scheduler的数目N,拷贝出N个进程,调用的时候,根据当前scheduler id选择对应的进程。
方案1的确是一个简陋的方案,但不是一个值得推崇的方案。

我们应该选择方案3,其符合架构上的拓展(功能分割),可以平滑的走向分布式。采用这种方法,web前端(erlang)的目的就是接受用户请求,可以同时处理上万的连接,这些进程是同类型的均等的。连接需要的处理操作,通过各种服务器节点(erlang)来处理。
这样我们的web server可以有1M个进程,而服务器节点可以只有100个进程,每个部分都充分利用机器性能,不会因为数量问题产生不快。

以后记住当某个进程“吃不消”的时候,首先考虑是你的架构上出问题了么?如果没有,那么就认真的分析分析各部分的处理能力,让最“累”的工作有更多的人分担。
随着系统不断进行,你也更加的熟悉你的系统,这添一砖那加一瓦,让他更好的提供服务。

Erlang进程真的没错,简单才是美.

分享到:
评论
5 楼 langzhe 2010-06-04  
litaocheng 写道
mryufeng 写道
公平很重要,如果进程层面进程竞争有问题,那么提升到节点的高度,和现实中解决这个问题是一样的: 阶级不同 竞争的东西也就不同。

驴子在拉磨,小马在奔腾,千万别让他们一起折腾哈哈...


第二种方案怎么没给出解释?

第三种方案描述的非常好。
阶级不同 竞争的东西也就不同(社会地位不同竞争的东西同样不同)
node(核心进程放入一个独立的node)就是国际社会。web server就像每个国家的元首都在国际上为自己的“子民”争取最大利益。每个web请求就是子民的生存方式。
4 楼 techabc 2009-08-12  
当真是理不辩不明啊,通过大牛们的那些讨论,对erlang系统特性也有多更多的理解。
还请指点:erlang系统怎样才能实现双机热备呢? 用erlang实现双机热备、负载均衡这些方面有哪些资料可供学习?
3 楼 mryufeng 2009-07-27  
很生动 给他们不同的舞台就是
2 楼 litaocheng 2009-07-27  
mryufeng 写道
公平很重要,如果进程层面进程竞争有问题,那么提升到节点的高度,和现实中解决这个问题是一样的: 阶级不同 竞争的东西也就不同。

驴子在拉磨,小马在奔腾,千万别让他们一起折腾哈哈...
1 楼 mryufeng 2009-07-27  
公平很重要,如果进程层面进程竞争有问题,那么提升到节点的高度,和现实中解决这个问题是一样的: 阶级不同 竞争的东西也就不同。

相关推荐

    Erlang进程模型学习PPT

    Erlang进程模型特点 一个进程可以创建数以万计的轻量级进程 每个轻量级进程仅仅完成单一功能 一个复杂的功能可以由多个轻量级进程协同完成 当遇到file或socket等阻塞的io时, 调用的轻量级进程被阻塞,整个进程不...

    Erlang进程池WorkerPool.zip

    Worker Pool 是一个Erlang进程池,其中的工作进程是Erlang的gen server模式进程。Worker Pool的目标是非常简单: 提供以透明的方式管理一批工作进程并且对分配到池中的任务尽最大努力实现负载均衡。一个 Echo 服务器...

    erlang 中进程

    关于erlang并发开发的一些例子,便于学习supersivor

    introducing erlang

    ●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...

    Erlang并发编程,Erlang程序设计,Erlang中文手册

    使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。 使用Erlang来编写分布式应用...

    erlang-18.3.4.7-1.el6.x86_64.rpm

    ●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。 ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。 ●面向并发的编程(COP concurrency-oriented programming) ...

    Erlang安装手册

     ●外部接口-Erlang进程与外部世界之间的通讯使用和在Erlang进程之间相同的消息传送机制。  ●Fail-fast(中文译为速错),即尽可能快的暴露程序中的错误。  ●面向并发的编程(COP concurrency-oriented ...

    Erlang入门:构建application练习4(进程link的作用)

    Erlang入门:构建application练习4(进程link的作用),实例演示进程link的作用及效果

    evum:["Linux VM", ["Erlang 进程", ["Erlang VM"]]]

    在 Erlang VM 中将 Linux VM 作为 Erlang 进程生成。 evum 使 Linux 虚拟机成为 Erlang actor。 虽然 Linux VM 像任何其他进程(内存、系统进程、磁盘)一样拥有自己的状态,但与外部世界的所有 I/O 都是通过 ...

    gproc, Erlang的扩展进程注册表.zip

    gproc, Erlang的扩展进程注册表 gproc应用程序作者: 超级用户,约瑟夫 Wayne 。扩展进程字典 注释Gproc有两个依赖项:gen_leader 和 edown 。 由于大多数人都不积极使用,所以默认情况下它们不再被获取。要启用 gen...

    erlang-18.0-win64

    Erlang是一个结构化,动态类型...使用Erlang编写出的应用运行时通常由成千上万个轻量级进程组成,并通过消息传递相互通讯。进程间上下文切换对于Erlang来说仅仅 只是一两个环节,比起C程序的线程切换要高效得多得多了。

    erlpool:基于ETS的Erlang进程的Erlang循环负载均衡器

    Erlpool是用于Erlang进程的循环负载均衡器,主要用于与数据库连接之类的事情。 与和相比, erlpool非常简单且很小(〜100 LOC),并且没有关于工人的假设。 每次您请求pid时,库都会通过ETS进行一次counter_update...

    erlang整理的一些心得和lunix查看cpu和内存信息的方法

    erlang整理的一些心得和lunix查看cpu和内存信息的方法

    varpool:Erlang进程池作为局部变量

    varpool:Erlang进程池作为局部变量

    Erlang6大数据存储方式总结

    个人学习Erlang对于Erlang处理数据的各种方式的总结,讲述编程语言Erlang的ets,dets,mnesia,mysql,dict,和进程字典的用法,希望能帮助读者在这个总结里学到一些东西.

    Erlang中的注册进程使用实例

    主要介绍了Erlang中的注册进程使用实例,本文给出正常进程通信实例和使用使用注册进程通信实例,需要的朋友可以参考下

    shard:Erlang 库基于散列函数将工作分片到子进程

    分片 - 一致的工人一个 Erlang 库,用于一致地将工作分配给工作进程,默认实现使用 riak 核心的 chash 散列模块将密钥散列到工作进程。用法您可以通过调用创建一个哈希: {ok, Shard} = shard:start_link([{rscbag_...

    erlang启动多节点,跨节点调用函数

    1.完成makefile,直接运行/script目录中的makefile.cmd就能编译文件 2.完成启动多节点的脚本,运行/script目录中的run.cmd可以启动3个节点, 节点的配置在/config目录config.txt中 3.完成跨节点函数的调用,记录...

    程序员开发erlang的资料

    java/c程序员开发erlang的资料

    eredis_smart_sub:在 eredis(erlang redis 客户端)之上的层,用于在 pubsub 中的几个订阅者进程之间复用子连接

    erdis_smart_sub eredis_smart... 为每个 Erlang 进程打开一个连接感觉不是很干净,是吗? 在 eredis 之上写一个层,其中一个进程将接收所有消息并将它们发送回正在侦听相应通道的进程。 eredis_smart_sub 实现了第二种

Global site tag (gtag.js) - Google Analytics