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,还是网络。总之到了极限状态,出现什么问题都很正常。
自己没这方面的经验,也没有什么可比的。困惑好久了,怀疑上限,但不想信是系统上限。徘徊了半个月
分享到:
相关推荐
Erlang OTP设计原则中的Gen_Fsm行为是一个关键的概念,用于构建健壮、可扩展的并发应用程序。Gen_Fsm,即通用有限状态机,是一种行为模式,它提供了一种结构化的方法来处理具有多种状态和事件的系统。本文将深入探讨...
erlang-gen_tcp手册,详细完整,网络tcp开发好东东
Sys和Proc_Lib部分讲解了Erlang系统的基本调试方法和特殊进程的处理。应用章节则阐述了如何定义和组织应用,包括应用的概念、回调模块、资源文件、目录结构、应用控制器、加载和卸载、启动和停止、配置和应用启动...
gen_tcp是Erlang OTP(开放电信平台)提供的一种行为模块,它允许程序员以面向过程的方式处理TCP连接。gen_tcp提供了创建、监听、接受和关闭TCP套接字的函数,以及发送和接收数据的基本操作。 **Erlang的并发特性**...
综上所述,"plain_fsm"是一个面向Erlang开发者的实用工具,它提供了一种标准化的方法来构建和操作有限状态机,简化了并发和分布式系统中的状态管理任务。通过深入理解和使用这个库,开发者可以更高效地解决复杂的...
erlang_23.0.2-1版本 centos7 64bit esl-erlang_23.0.2-1_centos_7_amd64.rpm
在"erlang_otp_win64_25.0"这个标题中,我们可以提取出几个关键点: 1. **Erlang**:这是一种函数式编程语言,以其在处理并发性和容错性方面的强大能力而闻名。Erlang的设计理念是让程序员能够轻松地构建能够并行...
Erlang B 和 Erlang C 是在电信领域中广泛使用的两个数学公式,用于预测和管理电话交换系统的呼叫处理能力。这两个公式由丹麦工程师 Agner Krarup Erlang 在20世纪初开发,对于理解通信系统中的呼叫占用率、阻塞率和...
通过`-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在处理数据库操作时可能存在与XMPP(可扩展消息处理即时协议)标准不完全一致的问题。ejabberd是一...
在这个压缩包中,我们有一个名为"Erlang_B_model.pdf"的文件,它很可能是这样的手册的一部分,提供了关于Erlang B模型的理论、公式以及查表方法。 **Erlang B公式**表达了一个服务系统(如电话交换机)在固定数量的...
从给定的文件信息中,我们可以提炼出一些关于Erlang语言以及其参数化模块的重要知识点。 首先,Erlang是一种严格、动态类型的函数式编程语言。它的特点是没有破坏性更新,即数据不可变。Erlang内置了对并发的支持,...
Erlang OTP 19_win64是一款专为Windows 64位系统设计的Erlang软件开发工具包,它包含Erlang编程语言和OTP(Open Telecom Platform)框架。Erlang是一种强大的、动态类型的函数式编程语言,特别适合构建高可用性、...
Erlang OTP (Open Telephony Platform) 是一种高级编程语言,专为构建高并发、分布式、容错性强的系统而设计。22.3 版本是 Erlang OTP 的一个稳定版本,它提供了许多增强的功能和性能改进。下面将详细介绍这个版本的...
- **2.3.1 有限状态机**:Erlang中的Gen_Fsm行为允许实现有限状态机。 - **2.3.2 实例**:提供了一个Gen_Fsm行为的实例。 - **2.3.3 启动一个Gen_Fsm**:如何启动一个有限状态机。 - **2.3.4 事情通知**:事件被...
### Erlang程序语言知识点 #### 一、Erlang简介 Erlang是一种由Ericsson计算机科学实验室设计和开发的程序语言。它最初是为了满足电信系统的需求而创建的,后来开源化以促进其在Ericsson之外的发展。Erlang特别...
标题“esl-erlang_19.3_osx_10.10_amd64.dmg”指的是一个特定版本的Erlang编程环境的安装镜像文件,由Erlang Solutions Limited(ESL)发布,适用于Apple macOS 10.10 Yosemite操作系统,并且是为64位AMD处理器设计...
OTP库提供了许多实用的模块,如gen_server、gen_event和gen_fsm,这些都是Erlang并发编程的基础。 总而言之,Erlang9.rar是一个包含Erlang/OTP 20.0 Windows 64位安装程序的压缩包,主要用于安装Erlang环境,以...