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方法:
- wait_resp_mon(Node, Mref, Timeout) ->
- receive
- {Mref, Reply} ->
- erlang:demonitor(Mref, [flush]),
- {ok, Reply};
- {'DOWN', Mref, _, _, noconnection} ->
- exit({nodedown, Node});
- {'DOWN', Mref, _, _, Reason} ->
- exit(reason)%%langxw
- after Timeout ->
- erlang:demonitor(Mref),
- receive
- {'DOWN', Mref, _, _, _} -> true
- after 0 -> true
- end,
- exit(timeoutmon)%%langxw
- end.
下面是测试日志
- =INFO REPORT==== 2010-12-05 20:09:53 ===
- 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,
- A2={timeout,{sys,get_status,
- ['ejabberd_odbc_sup_testrsa.igrslabdns.com',1000]}}...
- ** Reason for termination =
- ** {timeout,
- {p1_fsm,sync_send_event,
- [<0.288.0>,
- {sql_cmd,
- {sql_query,
- ["SELECT deviceid FROM devices WHERE deviceid = '",
- "tsung","';"]}},
- 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,还是网络。总之到了极限状态,出现什么问题都很正常。
自己没这方面的经验,也没有什么可比的。困惑好久了,怀疑上限,但不想信是系统上限。徘徊了半个月