论坛首页 综合技术论坛

关于etop输出Erlang top got garbage与gen_tcp的疑惑

浏览 5497 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (1)
作者 正文
   发表时间:2010-01-18  
小弟刚使用erlang不久,做一个广播服务器,有1w多个连接, 遇到两个问题:

1.使用etop监控程序时发现输出很多Erlang top got garbage,是不是内存泄露了呢?
Erlang top got garbage {trace_ts,<4897.30040.98>,out,
                                 {gen,wait_resp_mon,3},
                                 {1263,783491,9919}}
Erlang top got garbage {trace_ts,<4897.44.0>,out,
                                 {ets,select_trap,1},
                                 {1263,783491,55033}}
Erlang top got garbage {trace_ts,<4897.30043.98>,out,
                                 {prim_inet,accept0,2},
                                 {1263,783491,55055}}
Erlang top got garbage {trace_ts,<4897.19490.97>,out,
                                 {gen,wait_resp_mon,3},
                                 {1263,783491,58450}}
Erlang top got garbage {trace_ts,<4897.30042.98>,out,
                                 {gen,wait_resp_mon,3},
                                 {1263,783491,58535}}
Erlang top got garbage {trace_ts,<4897.44.0>,out,
                                 {ets,select_trap,1},
                                 {1263,783491,260009}}
========================================================================================
chatapp@localhost                                                         02:58:10
Load:  cpu        16               Memory:  total      306706    binary      82753
        procs   16313                        processes  153462    code         3438
        runq        0                        atom          384    ets         14393

Pid            Name or Initial Func    Time    Reds  Memory    MsgQ Current Function
----------------------------------------------------------------------------------------
<4897.44.0>    chatets               88026518373491  121896       0 gen_server:loop/6  
<4897.45.0>    chatserver              2612    5147   24608       0 gen_server:loop/6  
<4897.29320.98>proc_lib:init_p/5        546     634   24608       0 prim_inet:recv0/3  
<4897.29505.98>proc_lib:init_p/5        537     284    6952       0 prim_inet:recv0/3  
<4897.29448.98>proc_lib:init_p/5        499     387   11832       0 prim_inet:recv0/3  
<4897.29471.98>proc_lib:init_p/5        440     270    5800       0 prim_inet:recv0/3  
<4897.29374.98>proc_lib:init_p/5        403     270    5800       0 prim_inet:recv0/3  
<4897.29352.98>proc_lib:init_p/5        396     437   24608       0 prim_inet:recv0/3  
<4897.29521.98>proc_lib:init_p/5        381     274    5800       0 prim_inet:recv0/3  
<4897.29404.98>proc_lib:init_p/5        357     386   16712       0 prim_inet:recv0/3  
========================================================================================

2.看到很多crash日志,内容为:
CRASH REPORT  <6431.14236.92>                               2010-01-18 10:25:25
===============================================================================
Crashing process                                                              
   initial_call
         {chatserver,accept_loop,
                    ['Argument__1','Argument__2','Argument__3',
                     'Argument__4']}
   pid                                                          <6431.14236.92>
   registered_name                                                           []
   error_info
         {error,{case_clause,{error,etimedout}},
               [{chatserver,socket_loop,1},{proc_lib,init_p_do_apply,3}]}
   ancestors                                            [chatserver,<6431.2.0>]
   messages                                                                  []
   links                                                   [#Port<6431.900585>]
   dictionary                                                                []
   trap_exit                                                              false
   status                                                               running
   heap_size                                                                987
   stack_size                                                                24
   reductions                                                               424

是不是很gen_tcp:recv(Sock, 0)这里没有处理超时的错误呢,我看很多代码也没有做处理.

以上两个问题,各位有经验的老大能否给小弟个提示,谢谢!
   发表时间:2010-01-19   最后修改:2010-01-19
看到{case_clause,{error,etimedout}}了吗,  也就是说 socket读写超时错误 你都没有处理. 这说明你的系统非常繁忙,超过了erlang的应对能力.

我分析了下 Erlang top got garbage的原因, 最可能的原因就是 因为你的pid在trace_tr收到in的时候还活着, 但是由于进程死掉了, 没有继续给trace发out消息, 所以trace模块就糊涂了, 匹配错了.
0 请登录后投票
   发表时间:2010-01-19  
mryufeng 写道
看到{case_clause,{error,etimedout}}了吗,  也就是说 socket读写超时错误 你都没有处理. 这说明你的系统非常繁忙,超过了erlang的应对能力.

我分析了下 Erlang top got garbage的原因, 最可能的原因就是 因为你的pid在trace_tr收到in的时候还活着, 但是由于进程死掉了, 没有继续给trace发out消息, 所以trace模块就糊涂了, 匹配错了.


谢谢yufeng老大指点,这个服务器实现的是一些广播和聊天功能,是不是超过1w个连接已经超过了erlang的应对能力,要考虑开多个节点了?
第二个问题,我菜鸟级别还看不懂啥意思,能否理解是因为第一个问题,系统负载不来而引起的了?
0 请登录后投票
   发表时间:2010-01-19  
xiaoshengaya 写道
mryufeng 写道
看到{case_clause,{error,etimedout}}了吗,  也就是说 socket读写超时错误 你都没有处理. 这说明你的系统非常繁忙,超过了erlang的应对能力.

我分析了下 Erlang top got garbage的原因, 最可能的原因就是 因为你的pid在trace_tr收到in的时候还活着, 但是由于进程死掉了, 没有继续给trace发out消息, 所以trace模块就糊涂了, 匹配错了.


谢谢yufeng老大指点,这个服务器实现的是一些广播和聊天功能,是不是超过1w个连接已经超过了erlang的应对能力,要考虑开多个节点了?
第二个问题,我菜鸟级别还看不懂啥意思,能否理解是因为第一个问题,系统负载不来而引起的了?

1. 你的程序写的好坏直接关系到erlang的性能. 不过1W左右的链接在一般的情况下,未调整的程序,应该是可以让你的系统非常忙.

2. 你可以不care这个问题, 就当成没事就好, 那是tracer模块的问题.
0 请登录后投票
   发表时间:2010-01-20   最后修改:2010-01-20
对于socket读写超时,我在官方的帮助文档上面查到这么一句话
The optional Timeout parameter specifies a timeout in milliseconds. The default value is infinity.

我在recv是这么写的:

socket_loop(Sock) ->
case gen_tcp:recv(Sock, 0) of
{ok, Data} ->
...
{error, closed} ->
...
{error, Reason} ->
error_logger:error_msg("error:~w~n", [Reason])
end.
在recv时没有设置超时时间,所以疑惑为什么会出现timeout的error?
0 请登录后投票
   发表时间:2010-01-22  
ETIMEOUT应该是TCP层产生的错误,在没启用keepalive选项的时候,还有什么情况会出现etimeout错误呢.这个问题纠结了我几天,一直无法确认是哪里出现问题.
0 请登录后投票
   发表时间:2010-01-22   最后修改:2010-01-22
这个纠结什么 search下etimeout 把可能出现的地方 都打上日志 就知道什么原因了 不是?
0 请登录后投票
论坛首页 综合技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics