`
langzhe
  • 浏览: 286402 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于 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,还是网络。总之到了极限状态,出现什么问题都很正常。 

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

 

0
0
分享到:
评论

相关推荐

    erlang OTP Design Principles之Gen中文

    Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...

    erlang-gen_tcp手册

    erlang-gen_tcp手册,详细完整,网络tcp开发好东东

    Erlang_OTP_设计原理(含目录).pdf

    Sys和Proc_Lib部分讲解了Erlang系统的基本调试方法和特殊进程的处理。应用章节则阐述了如何定义和组织应用,包括应用的概念、回调模块、资源文件、目录结构、应用控制器、加载和卸载、启动和停止、配置和应用启动...

    基于Erlang的gen_tcp聊天室代码,功能完整

    gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...

    plain_fsm:一个行为支持库,用于编写普通的Erlang FSM

    综上所述,"plain_fsm"是一个面向Erlang开发者的实用工具,它提供了一种标准化的方法来构建和操作有限状态机,简化了并发和分布式系统中的状态管理任务。通过深入理解和使用这个库,开发者可以更高效地解决复杂的...

    esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm

    erlang_otp_win64_25.0

    在"erlang_otp_win64_25.0"这个标题中,我们可以提取出几个关键点: 1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行...

    Erlang-Formula.zip_Erlang B _Erlang-B_erlang_erlang B计算_erlang C

    Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...

    erlang 参考手册 模块部分--自己翻译的中文版

    通过`-behaviour(Behaviour)`,模块可以声明为特定行为的回调模块,如OTP标准行为`gen_server`、`gen_fsm`、`gen_event`和`supervisor`。 4.2.3 记录(Record)定义 使用`-record(Record, Fields)`定义记录,记录...

    ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议

    标题中的“ejabberd中mod_privacy_odbc.erl实现没有完全遵循xmpp协议”指出,ejabberd服务器的模块mod_privacy_odbc在处理数据库操作时可能存在与XMPP(可扩展消息处理即时协议)标准不完全一致的问题。ejabberd是一...

    Erlang_B_model.rar_Erlang B _Erlang B model_Wireless Handbook_e

    在这个压缩包中,我们有一个名为"Erlang_B_model.pdf"的文件,它很可能是这样的手册的一部分,提供了关于Erlang B模型的理论、公式以及查表方法。 **Erlang B公式**表达了一个服务系统(如电话交换机)在固定数量的...

    erlang两种参数模块化

    从给定的文件信息中,我们可以提炼出一些关于Erlang语言以及其参数化模块的重要知识点。 首先,Erlang是一种严格、动态类型的函数式编程语言。它的特点是没有破坏性更新,即数据不可变。Erlang内置了对并发的支持,...

    分布式应用Erlang:Erlang_OTP_19_win64

    Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...

    erlang_otp_src_22.3.tar.gz

    Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...

    Erlang中文手册.pdf

    - **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例**:提供了一个Gen_Fsm行为的实例。 - **2.3.3 启动一个Gen_Fsm**:如何启动一个有限状态机。 - **2.3.4 事情通知**:事件被...

    erlang的翻译文档

    ### Erlang程序语言知识点 #### 一、Erlang简介 Erlang是一种由Ericsson计算机科学实验室设计和开发的程序语言。它最初是为了满足电信系统的需求而创建的,后来开源化以促进其在Ericsson之外的发展。Erlang特别...

    esl-erlang_19.3_osx_10.10_amd64.dmg

    标题“esl-erlang_19.3_osx_10.10_amd64.dmg”指的是一个特定版本的Erlang编程环境的安装镜像文件,由Erlang Solutions Limited(ESL)发布,适用于Apple macOS 10.10 Yosemite操作系统,并且是为64位AMD处理器设计...

    erlang9.rar

    OTP库提供了许多实用的模块,如gen_server、gen_event和gen_fsm,这些都是Erlang并发编程的基础。 总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以...

Global site tag (gtag.js) - Google Analytics