Archive

Archive for the ‘Erlang探索’ Category

Erlang supervisor规格的dynamic行为分析

July 26th, 2011 6 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Erlang supervisor规格的dynamic行为分析

今天benjamin同学在网上问了以下问题:

我在看mochiweb和misultin的代码时有一些不理解的地方,以下是代码:

init({MainSupRef, Port, OptionsTcp, AcceptorsPoolsize, RecvTimeout, SocketMode, CustomOpts}) ->
?LOG_DEBUG(“starting listening ~p socket with options ~p on port ~p”, [SocketMode, OptionsTcp, Port]),
case misultin_socket:listen(Port, OptionsTcp, SocketMode) of
{ok, ListenSocket} ->
Acceptors = [
{{acceptor, N}, {misultin_acceptor, start_link, [MainSupRef, ListenSocket, Port, RecvTimeout, SocketMode, CustomOpts]},
permanent, brutal_kill, worker, dynamic}
|| N ],
{ok, {{one_for_one, 5, 10}, Acceptors}};

我不明白的就是为什么是dynamic,我查看supervisor文档,文档上写只有gen_event才应该是dynamic,而这里misultin_acceptor这个进程是使用proc_lib:spawn_link产生的。我在proc_lib的文档中也没有发现这里为什么应该使用dynamic。请您指教。

考虑到这种应用很多,而且基本上supervisor文档上讲的不是很清楚,所以我花时间调查了下,以下是我调查的过程和结果:
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: ,

Erlang R15最大的卖点Native Process

July 21st, 2011 34 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Erlang R15最大的卖点Native Process

R15最激动人心的东西就是这个Native Process,请参看Rickard Green写的Future Extensions to the Native Interface:看 这里

我来blabla下。 做过Erlang规模程序的人都知道有个痛, Erlang的公平调度引起的痛。 举个例子,比如说日志服务。当我们的系统有成千上万的进程需要日志服务的时候,我们通常会把日志的内容发给一个日志进程由它来负责持久化。这是个典型的模块划分方法,我们之前的c程序也都是这么干的。但是在erlang下这样很容易有问题。大家知道Erlang讲究公平,进程调度是公平的,port调度是公平的,bif使用是公平的,甚至ets这样的模块使用也是公平的。那么我们就可以这么理解。如果一个系统里面有N个进程需要服务,那么总进程数目是N+1, 平均来分配时间片。反过来说就是这个日志进程只能分的整个系统的1/(N+1)的cpu计算能力,但是要干N个活。后果就是这个进程忙不过来,导致消息队列不停的加大,消息队列需要堆内存,这个内存需求越来越大,最后系统分配不出内存,最终vm挂掉了。
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: ,

The Erlang/OTP Roadmap(Erlang Factory London 2011)

July 11th, 2011 1 comment

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: The Erlang/OTP Roadmap(Erlang Factory London 2011)

刚结束不久的Erlang Factory London 2011我很关心的是The Erlang/OTP Roadmap, 每年由Kenneth Lundin宣布的下一年的开发计划,对我们掌握erlang团队的开发进度和方向非常有帮助。
今年的ppt参看 这里

R15的开发包括:

  • Line number info in crash reports
  • 64bit Windows version
  • SMP performance improvements
  • ASN.1 encode/decode performance

更长期的包括:

  • compilation(using HiPE/LLVM)
  • Experiments and EEP for new
  • datatype Hashes
  • Native processes (maybe some steps already in R15B)
  • More multicore scalability improvements

重点还是在提高Erlang的性能和易用性,感谢OTP团队给我们带来这么好的产品。

更多的话题看这里:http://www.erlang-factory.com/conference/London2011/talks

玩得开心!

 

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: , ,

”Erlang supervisor 极其白痴的 Bug“的澄清

July 4th, 2011 2 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: ”Erlang supervisor 极其白痴的 Bug“的澄清

2008-05-26的时候, 著名的Trustno1发表了这篇文章 http://www.iteye.com/topic/197097 抱怨Erlang supervisor 极其白痴的一个bug.

今天 @淘李福 同学重新提起这个事情:

翻到一个老帖子: http://www.iteye.com/topic/197097
现在是 R14 ,代码还是那样,我觉得是不是我们理解错了,shutdown属于normal退出

由于该帖子关闭评论, 所以我在这里澄清下,这个不是bug!

前几天我重新读了下init.erl的代码,是特地的设计,目的是在系统init:stop的时候为了让kernel进程包括supervisor tree有个正常退出的机会。

我们来看下init:stop 的代码:
erts/preloaded/src/init.erl
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: ,

TCP链接主动关闭不发fin包奇怪行为分析

July 1st, 2011 3 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: TCP链接主动关闭不发fin包奇怪行为分析

问题描述:
多隆同学在做网络框架的时候,发现一条tcp链接在close的时候,对端会收到econnrest,而不是正常的fin包. 通过抓包发现close系统调用的时候,我端发出rst报文, 而不是正常的fin。这个问题比较有意思,我们来演示下:
Read more…

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索, 网络编程 Tags: , ,

gen_tcp容易误用的一点解释

July 1st, 2011 5 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: gen_tcp容易误用的一点解释

前天有同学在玩erlang gen_tcp的时候碰到了点小麻烦,描述如下:

比如说连接到baidu.com,发个http请求,然后马上接收数据,发现接收出错,wireshark抓包发现数据都有往返发送,比较郁闷。

我把问题演示下:

 
$ erl
Erlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:16:16] [rq:16] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.4  (abort with ^G)
1> {ok,Sock} = gen_tcp:connect("baidu.com", 80, []).
{ok,#Port<0.582>}
2> gen_tcp:send(Sock, "GET / HTTP/1.1\r\n\r\n").
ok
3> gen_tcp:recv(Sock,0).
{error,einval}

这个问题的根源在于gen_tcp默认的{active,true},也就是说当gen_tcp收到网络包的时候,默认是把报文发送给它的宿主进程。而gen_tcp:recv是用户主动去拉数据,这二个模式是互斥的。

我们来看下代码otp/erts/emulator/drivers/common/inet_drv.c:7462

case TCP_REQ_RECV: {
..
        if (desc->inet.active || (len != 8))
            return ctl_error(EINVAL, rbuf, rsize);
..

那就解释为什么 gen_tcp:recv(Sock,0)返回错误码{error,einval}。
同时我们来验证下,报文是以消息的方式发送的。

 
4> flush().
Shell got {tcp,#Port<0.582>,
               "HTTP/1.1 400 Bad Request\r\nDate: Fri, 01 Jul 2011 03:51:25 GMT\r\nServer: Apache\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n127\r\n<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<HTML><HEAD>\n<TITLE>400 Bad Request</TITLE>\n</HEAD><BODY>\n<H1>Bad Request</H1>\nYour browser sent a request that this server could not understand.<P>\nclient sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /<P>\n</BODY></HTML>\n\r\n0\r\n\r\n"}
ok
5>

搞清楚了问题,那解决方案很简单,connect的时候把active模式设成{active,false}.
再来演示下:

$ erl
Erlang R14B03 (erts-5.8.4) [source] [64-bit] [smp:16:16] [rq:16] [async-threads:0] [hipe] [kernel-poll:false]

Eshell V5.8.4  (abort with ^G)
1> {ok,Sock} = gen_tcp:connect("baidu.com", 80, [{active,false}]).
{ok,#Port<0.582>}
2> gen_tcp:send(Sock, "GET / HTTP/1.1\r\n\r\n").
ok
3>  gen_tcp:recv(Sock,0).
{ok,"HTTP/1.1 400 Bad Request\r\nDate: Fri, 01 Jul 2011 05:25:15 GMT\r\nServer: Apache\r\nConnection: Keep-Alive\r\nTransfer-Encoding: chunked\r\nContent-Type: text/html; charset=iso-8859-1\r\n\r\n127\r\n<!DOCTYPE HTML PUBLIC \"-//IETF//DTD HTML 2.0//EN\">\n<HTML><HEAD>\n<TITLE>400 Bad Request</TITLE>\n</HEAD><BODY>\n<H1>Bad Request</H1>\nYour browser sent a request that this server could not understand.<P>\nclient sent HTTP/1.1 request without hostname (see RFC2616 section 14.23): /<P>\n</BODY></HTML>\n\r\n0\r\n\r\n"}
4> 

搞定!

玩得开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索, 网络编程 Tags: ,

Erlang/OTP R14B03发布

May 30th, 2011 3 comments

原创文章,转载请注明: 转载自系统技术非业余研究

本文链接地址: Erlang/OTP R14B03发布

Erlang/OTP R14B03 has been released as planned on May 25:th 2011. It is the third R14 service release.

Highlights:
* Diameter is a brand new application in this release. The application support the diameter protocol specified in RFC 3588 and is intended to provide an Authentication, Authorization and Accounting (AAA) framework for applications.
* The documentation for stdlib and kernel now uses type specifications from the source modules which should guarantee that the documentation and code are consistent with regard to the type information.

详细参见:http://www.erlang.org/download/otp_src_R14B03.readme
下载:http://www.erlang.org/download.html

这次发布主要是bugfix修正了些vm方面的bug,整理了下文档。需要稳定性的同学暂时不要更新,这个版本貌似还是不够稳定,刚出版本就发现引入了些bug。

玩得开心!

Post Footer automatically generated by wp-posturl plugin for wordpress.

Categories: Erlang探索 Tags: , ,