关于 erlang(sys模块\gen模块)与ejabberd(p1_fsm)的timeout 解决方法

sys:getstatus timeout问题已在ejabberd2.1.5版本里面得到了解决


最近测试发现 日志总是出现timeout提示。

分析发现都是erlang代码里面gen.erl 模块中的wait_resp_mon方法惹的祸。

wait_resp_mon中有receive——after——Timeout ,最终确定就是此处的Timeout引起。

写了一个小程序,测试了一下,receive 在有很多消息发过来是,处理不了的时候就会执行Timeout的程序。

请问有没有好的办法解决这个问题?

 

wait_resp_mon方法:

Erlang代码 
  1. wait_resp_mon(Node, Mref, Timeout) ->  
  2.     receive  
  3.         {Mref, Reply} ->  
  4.             erlang:demonitor(Mref, [flush]),  
  5.             {ok, Reply};  
  6.         {'DOWN', Mref, _, _, noconnection} ->  
  7.             exit({nodedown, Node});  
  8.         {'DOWN', Mref, _, _, Reason} ->  
  9.             exit(reason)%%langxw  
  10.     after Timeout ->  
  11.             erlang:demonitor(Mref),  
  12.             receive  
  13.                 {'DOWN', Mref, _, _, _} -> true  
  14.             after 0 -> true  
  15.             end,  
  16.             exit(timeoutmon)%%langxw  
  17.     end.  
 

 

 

 

下面是测试日志

 

Log代码 
  1. =INFO REPORT==== 2010-12-05 20:09:53 ===  
  2. I(<0.25621.0>:ejabberd_odbc_sup:100) : langxwgetstatus Inejabberd_odbc_sup on 100line Proc'ejabberd_odbc_sup_testrsa.igrslabdns.com',is_process_alive=true ..catchER A1=exit,  
  3. A2={timeout,{sys,get_status,  
  4.                     ['ejabberd_odbc_sup_testrsa.igrslabdns.com',1000]}}...  
  5.   
  6. ** Reason for termination =  
  7. ** {timeout,  
  8.        {p1_fsm,sync_send_event,  
  9.            [<0.288.0>,  
  10.             {sql_cmd,  
  11.                 {sql_query,  
  12.                     ["SELECT deviceid FROM devices WHERE deviceid = '",  
  13.                      "tsung","';"]}},  
  14.             2000]}}  
 

 

 

是的是超时,但我不知道是哪里引起超时的?难道是达到一定性能限制了?
当我写一个简单程序在测试时,我创建了1000个进程,每个进程发送10000次消息。超时我设置的0.5秒。
这时候 消息应该规远远不断的发送过来。不应该超时。
问题应该是 Pid ! {self(),...} 后,进入receive。self()没有在规定的时间内回复消息。
造成此问题的原因会不会是资源耗尽造成的?还是有其他原因?


立涛(373*)  13:12:59
这个就是请求没有应答超时了哦。。。
立涛(373*)  13:13:03
after Timeout
Android郎哲<langxianzhe@163.com>  13:14:49
是 after timeout了 但我没有查出来是什么原因 导致 timeout了
立涛(373*)  13:15:44
对方没有应答哦,或者是内部逻辑错误,或者是到达了系统的上限。
Android郎哲<langxianzhe@163.com>  13:16:50
我的CPU使用率 达到了 90%以上  根据这个能付判断 达到了系统上限?
立涛(373*)  13:17:09
那基本上是了。。
立涛(373*)  13:17:29
系统你拼命压测,到了一定程度肯定是超时了。啥系统都一样啊。
Android郎哲<langxianzhe@163.com>  13:17:35
那可能问题比较严重了
Android郎哲<langxianzhe@163.com>  13:18:17
我随便已测试 ejabberd cpu 就能达到90%
Android郎哲<langxianzhe@163.com>  13:19:38
ubuntu10.4 2G 内存 笔记本 1.8GCPU  
测试ejabberd 达到3W用户同时在线,相互发一个消息 就会出现timeout
Android郎哲<langxianzhe@163.com>  13:19:51
谢谢了
立涛(373*)  13:20:53
:) 差不多就这样了呵呵。
立涛(373*)  13:21:39
ejabberd只是相对比较成熟,功能比较全,与java等版本的xmpp服务器比还是有优势的,但是不代表它一定多么牛B。
Android郎哲<langxianzhe@163.com>ok 这问题困惑了我2周了 一直补确定,现在基本确定 心情舒畅多了
Android郎哲<langxianzhe@163.com> 13:52:13
立涛 如果说系统 达到上限了 进程会处于一个什么状态。 
Android郎哲<langxianzhe@163.com> 13:53:37
直接死掉 还是 抛出个内部错误 
立涛(3730*) 13:57:42
这个分很多情况哦,看内存,还是cpu,还是网络。总之到了极限状态,出现什么问题都很正常。 

自己没这方面的经验,也没有什么可比的。困惑好久了,怀疑上限,但不想信是系统上限。徘徊了半个月

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值