Archive

Archive for November, 2007

a pitfall in passing socket via processes

November 28th, 2007 :: jackyz

被问到一个奇怪的问题,做了一番探索,觉得还是有必要记录下来,以供来者参考。

如下的一个简单程序,会有什么问题?

下载: r3.erl
  1. -module(r3).
  2. -compile(export_all).
  3.  
  4. start() ->
  5.     spawn(r3, start, ["www.yahoo.com", 80]).
  6.  
  7. start(RHost, RPort) ->
  8.     io:format("start:pid=~p~n", [self()]),
  9.     {ok, Sock} = gen_tcp:connect(RHost, RPort, [list, {packet, 0}, {active, false}, {reuseaddr, true}]),
  10.     io:format("start:socket=~p~n", [erlang:port_info(Sock)]),
  11.     spawn(r3, test, [Sock]).
  12.  
  13. test(Sock) ->
  14.     io:format("test:pid=~p~n", [self()]),
  15.     io:format("socket=~p~n", [erlang:port_info(Sock)]),
  16.     ok = gen_tcp:send(Sock, "GET / HTTP/1.0\r\n\r\n"),
  17.     case gen_tcp:recv(Sock, 0) of
  18.         {ok, Pack} ->
  19.             io:format("recv:ok:~p~n", [Pack]);
  20.         Any ->
  21.             io:format("recv:~p~n", [Any])
  22.     end,
  23.     ok = gen_tcp:close(Sock).

OK,我知道这个简单的例子中,两个 spawn 都是没有必要的,实际上,不加这两个 spawn 一点问题也不会有,但是,加了似乎也没有什么明显的错误,不是么。那么,运行起来是怎样的呢?

1> r3:start().
start:pid=<0.33.0>
&
lt;0.33.0>
start:socket=[{name,"tcp_inet"},
              {
links,[<0.33.0>]},
              {
id,100},
              {
connected,<0.33.0>},
              {
input,0},
              {
output,0}]
test:pid=<0.37.0>
socket=undefined
2>
=
ERROR REPORT==== 27-Nov-2007::22:04:57 ===
Error in process <0.37.0> with exit value: {{badmatch,{error,closed}},[{r3,test,1}]}

是的,报了一个错,莫名奇妙啊,这是为什么呢?
Read more…

study

Erlang文档计划,发布中文文档《编写分布式的Erlang程序:陷阱和对策》

November 22nd, 2007 :: jackyz

gigix 完成了对Erlang文档计划中收录的 Hans Svensson 和 Lars­ Åke Fredlund 在 EUC 07 Erlang WorkShop 上发表的文档“Programming Distributed Erlang Applications: Pitfalls and Recipes”一文的翻译,端地是相当迅猛。

摘要

为了在 Erlang 运行时系统基础上开发更可靠的分布式系统和算法,我们研究了 Erlang 编程语言中分布式的部分。使用 Erlang,把一个运行在单个节点上的程序转换成完全分布式(运行在多个节点上)的应用程序可谓易如反掌(只需要修改对 spawn 函数的调用,使之在不同节点上产生进程);但尽管如此,Erlang 语言和 API 中仍然有一些阴暗的角落可能在引入分布式运算时带来问题。在本文中,我们将介绍几个这样的陷阱:在这些地方,取决于进程是否运行在同一个节点上,进程间通信的语义会有显著的差异。我们同时还提供了一些关于“编写安全的分布式系统”的指导原则。

这篇的评论说明了一切:“This talk should be part of the Erlang FAQ. Get a copy of the paper and read it!”——应该进入 FAQ 的东西,其重要性当然是不言而喻的。虽然 Erlang 在并发、并行和分布上提供了统一的机制(dcaoyuan语,我很赞同),但在“另一个节点”上的分布式编程还是会有一些模模糊糊的角落,一旦碰上就可能会耗费掉你大量的时间和精力。有了这份“Erlang寻宝注意事项”,无疑将能大大节约HP。

让我们对 gigix 向 erlang 中文社区作出的贡献(再次,并期待下次 :D )表示感谢!

英文原文在:这里
中文翻译在:这里

借 gigix 的光顺便做个广告,经过旷日持久的翻译《Programming Erlang》已进入收尾阶段,出版社近期将会放出部分样章,各位可以留意。

Erlang文档计划

news

[译]Why do you like Erlang?

November 20th, 2007 :: jackyz

作者:Tony Arcieri (Dive into Erlang)
原文:http://www.clickcaster.com/items/why-do-you-like-erlang
译者:朱照远(Joshua Zhu)

Not invented here

mryufeng 同学对于这一篇有过一个评价

感觉写的非常好(激动中) 和我的经历几乎一样 得出的结论就是: erlang就是我要的 网络应用erlang足够强大了

共鸣很强烈啊。

这篇文章也可以认为是一位长期战斗在“高性能服务器开发”第一线的兄弟“从 C 到 Erlang 的心路历程”。文中涉及了 n 多的技术框架和背景知识,从中我们可以看到一个完整的“服务器开发技术路线进化图谱”,非常精彩。现在好了,朱照远(Joshua Zhu)同学为我们扫清了语言障碍,带来了这篇文章精彩而生动的中文翻译版。

让我们对 朱照远(Joshua Zhu)向 erlang 中文社区作出的贡献表示感谢!

在线版请继续阅读,为方便收藏阅读,同时也提供 PDF 版,点此下载

Read more…

study

Erlang文档计划,发布中文文档《扩展 Erlang 的进程注册表》

November 20th, 2007 :: jackyz

gigix 已经完成了对 Erlang 文档计划 中收录的 U. Wiger. 在 EUC 07 Erlang WorkShop 上发表的文档“Extended Process Registry for Erlang”一文的翻译。

摘录

扩展Erlang的进程注册表

内建的进程注册表早已被实践证明是Erlang语言中一项极其有用的特性。它使得开发者能够很轻松地提供具名服务 (named services):用户无需知道服务进程的进程标识符(process identifier,PID)即可使用这些服务。

但目前的进程注册表也有其局限性:进程的名字必须是atom(不支持有结构的数据),每个进程只能用一个名字注册,并且缺乏有效的搜索和遍历机制。

在Ericsson下属的IMS Gateways的产品开发中,我们经常需要维护一张映射表,以便根据各种属性找到负责处理调用的进程。我们从中发现了一个通用的模式(一种索引表),并由此开始开发一个扩展的进程注册表。

一开始这个想法并没有立即体现出价值,甚至看不出在实用中提供了多大的便利。但随着开发的进行,程序设计者们越来越多地使用这个扩展的进程注册表,并因此显著减少了代码量、提高了实现一致性。此外,扩展的进程注册表还提供了一种强大的调试机制,能够在数万个进程中进行有效的调试 。

本文介绍了这种扩展的进程注册表,并对其进行检讨,从而提出一种新的实现方式,使之更具一致性、效率更高、并且支持全局命名空间。

这篇文章仔细研究了 Erlang 核心之一的注册机制,通过展现现有方式在解决具体需求时所面临的困境,指出了其功能与实际需求之间的差距。并从实践之中提取了进行扩展的方法(以及解决方案本身的演化)。非常难得的是,此文并没有纯从理论的角度泛泛而谈,而是基于实践,逐层分析,步步改进,是 the Erlang way 另外一篇非常不错的实战案例。其中对于 OTP 内部几处代码的分析与优化尤其精彩。值得认真一读。此外,由于 U. Wiger. 的特殊身份,如果这个扩展模块变成 OTP 的官方模块,大家也没有理由感到惊奇。

英文原文在:这里
中文翻译在:这里

让我们对 gigix 向 erlang 中文社区作出的贡献表示感谢!

另外, gigix 已经开始了对于“Programming Distributed Erlang Applications: Pitfalls and Recipes”一文的翻译,在 erlang 中文社区能有 gigix 这样优秀的译者,实乃大家之福。

Erlang文档计划

news

Erlana is on the way

November 19th, 2007 :: jackyz

中文 Erlang 社区发起的首个 Opensource 项目 Erlana

项目主页:http://code.google.com/p/erlana/
项目来由,参阅:http://erlana.googlecode.com/svn/trunk/doc/

上次 xushiwei 来北京,席间谈起这个项目,大家都觉得耳目一新。没错,大家是都觉得 erlang 不错,可是,始终也觉得缺乏一个有说服力的明证。一个恰如其分的项目,能用,好用,还能充分题现出技术本身的优势,这是最好的广告。一如 ejabberd 和 yaws 轰动的示范效果。

临渊慕鱼不如卷起袖子积极参与。学习一个技术的最好方式就是——使用它。

news

[presentations_and_photos]Erlang/OTP User Conference 2007

November 16th, 2007 :: KrzyCube

Erlang Gtalk 讨论群10月份聊天记录

November 15th, 2007 :: Arbow

Erlang Gtalk 群 10 月份聊天记录整理

Read more…

misc

CN Erlourge II 讲座的Video

November 12th, 2007 :: xushiwei

Wide Finder – Erlang实现

November 12th, 2007 :: dcaoyuan

Tim的WideFinder习题让多核和并行编程实践在一个简单的问题上有了多种语言作一次比较的机会,所以参与者甚多,我觉得也是很有意义的一件事。今天有点时间,作一个小总结。

目前排行榜上列第一、第二、第三的分别是OCaml+JoCaml,Erlang和Python。C/C++的版本理论上应该可以有很好的结果,但现在还没出来,这反倒说明用C/C++来完成这么一个简单的并行任务并不是很顺畅。

就Erlang的实现而言,基本上是一些象我这样的初学者慢慢摸索(Anders和Steve也都是初学者),加上专家们在一些关键地方的适时指点的过程。

现在看来,几个重要的转折在:
1、min_heap_size的设置对Binary性能的影响非常重要,这涉及到Heap的初始分配、GC的性能。好在探询合适的+h参数比较方便,在命令行加+h Size就可以了;
2、遍历Binary时尽量只移动指针,如无必要,就不要分解出子binary。这对Binary的操作性能也是至关重要,因为分解出的binary要在globle heap中分配并被GC回收,这样是要耗时间的。

解决上述问题后,Erlanger们(包括Anders, Pichi和我)立刻不需要再担心binary的性能,而且已经可以轻易击败ruby了。但要和最快的python实现(wf-6.py)相比,还要解决一个问题:搜索算法。python对定长字符串的搜索是2006年时由Fredrik Lundh写了一个Boyer-Moore的算法并加入到Python 2.5中的,因此Fredrik Lundh在实现他的WideFinder时很自然就用了它。Steve注意到了这一点,用Erlang实现了一个类似的,这样Erlang和Python的的比较才算公平。

于是Anders的wfinder8能在T5120上跑到4.42秒,与Fredrik Lundh的wf-6的4.38秒期鼓相当。

但Fredrik Lundh的wf-6.py和Fernandez的JoCaml版本都是利用操作系统的process来跑并行的。Erlang则是用操作系统的thread来调度自己的轻量process,因此Anders就再写了一个wfinder7_2,干脆跑n个node,每个node是一个操作系统的process,利用Node之间的通讯来合并结果,这个实现能跑到3.54秒,超过了Python,只比JoCaml的1.76秒慢。

还应该提到的是,JoCaml和Python都使用到了Memory Mapping,相当于把整个log文件读到和映射到内存中,因为Tim的那台T5120有8个G的内存,所以这个处理不会带来频繁的swap,不过我本人不喜欢这种方式。

我写程序比较喜欢简洁和直接了当,所以我的实现注重的是在简洁、可读和性能之间的平衡,最后的实现是tbray9a.erl,大约115行,最快是5.26秒。

与Python,JoCaml相比,我喜欢Erlang的地方在于,Erlang对并行和并发的支持在语法和机制上是一致的,而且性能也毫不逊色。Python在进程间通讯时使用了管道、JoCaml也基本上是这样,这也无所谓,但遇到并发情景时,Python和JoCaml就难受了,是用操作系统的Process呢还是用Thread?都不是好的方案。而对Erlang而言,并发和并行的处理机制是一致的,不管在是在自己的轻量processes层次,还是在Node层次,甚至,还有一个层次,就是,它同时还是分布的。

study

erlangbook ii and stocks?

November 11th, 2007 :: jackyz

erlang 的 maillist 里面最近在嗡嗡作响的事是——第二本 erlang 的书,以及一个有趣的新点子“erlang the stock”。

事情缘于 Joel Reymont 最近考虑要写第二本 erlang 的书,暂定名为《Hardcore Erlang》。

实际上,如果按照正式出版的纸版图书来说的话,应该是 erlang 语言的第三本。

Joel Reymont[》以下插播 n 多字的八卦]
第一本是 Joe Armstrong 和 Mickaël Rémond 在 2003 年合著的《Erlang programmation》,第二本是 Joe Armstrong 今年早些时候出的《 Programming Erlang: Software for a Concurrent World》。对于 Eyrolles (出版商)来说(向他们的勇气表示敬佩和慰问吧),这当第一的经验,恐怕是惨痛的。过于超前的推出时机,导致销售情况极不理想,以至于后来成为“票房毒药”的 Joe 想出第二本关于 erlang 的书时变得困难重重,此乃后话。

而时隔4年之后的第二本,是在 Joe Armstrong 的多方奔走之下,加上 intel 多核芯片面世带来明显升温的 erlang 社区,以及日渐汹涌的出书呼声,才由 Pragmatic Bookshelf 满腹狐疑的推出。想必,做出决策的时候,出版商的心里面也是凉凉的,没什么底。而这一本出乎意料的火爆(在 amazon 的排行榜上迅速攀升到了3k多,而且还在迅猛上升中),这自然引起了书商们出“续集”的强烈渴望。

相比第一本和第二本之间的四年,这第三本仅过了四个月时间就嚷嚷着要出了(当然了,目前还只是在策划阶段),相同的数字,不同的度量衡单位,让人不得不感叹“彼一时也,此一时也”。
[《好了,八卦插播结束,欢迎回来]

说回 Joel Reymont,此兄何许人也?请看这里这里还有这里这里。(是的,就是这位帅气拉风迷死人不偿命的 Joel 同学了,与 Yariv Sadan 并称为 erlang 两大新晋偶像,江湖地位十分了得。附送玉照一张,粉丝们不要抢,数字版,人人有份)

简单来说,此兄在 05 年就以一篇《Writing Low-Pain Massively Scalable Multiplayer Servers》名动编程界,震得跟帖无数(本站亦有收藏译文在此)。后转为 self employ 过着逍遥快活的日子,最近据说项目收尾了,要找有意思的事情做做。旋即传出要和 Roberto Saccon 一起来做“ActionScript (ECMAScript 4) to Erlang Compiler”的消息(本站亦有报导报导在此)。没想到,时隔不久就又得到了要写书的消息,两件颇不容易的事情能够齐头并进,确实是精力过人。

且来看看,这本《Hardcore Erlang》(暂定名)都有些什么精彩内容。

- The architecture of a poker server from far above

- Thinking processes instead of objects

- Game logic

- Stacking state machines

- Swapping logic

- Storing data in Mnesia

- State machines (gen_fsm)

- OTP behaviours

- Poker bots

- Simulating players

- Scripting

- Designing a network protocol

- Binary parsing

- Pickler combinators

- Automatic clustering

- Fault tolerance and fail-over

- Load balancing

- Testing a network server

- Debugging Erlang software

基本上,就是以 open poker 为基础,讲述 erlang 编程心得与思维方式的一本书。应该说,像这样来自实践的剖析和呈现会是非常吸引人的。更贪心一些,如果作者的语言又活泼风趣,能在轻松愉快的气氛中层层展现出自己清晰明了的思路(又看了一遍那篇《Writing Low-Pain Massively Scalable Multiplayer Servers》,对此我觉得甚为靠谱),那必将会是一本佳作。配合起 Joe Armstong 的 THE BOOK ,一个讲技术,一个讲实践,必将能够大大拉低“主流” OOP-er 们向 COP 转变的陡峭学习曲线。

而就在今天(呃,我的机器显示过了12点,已经是昨天了),此兄又冒出一个新点子:

I want to build a stock exchange and show you how to do it.

And of course I want to write a book about it.

The focus of the book is not changing, it’s still fault-tolerance,
scalability, distribution, etc. What’s changing is the software the
book is built around. Reading about how to build a stock exchange sure
as hell beats reading about a poker server.

What do you think?

我觉得很有意思!你意下如何?

news