gen_server的enter_loop分析】的更多相关文章

http://my.oschina.net/astute/blog/119250?p=1 在看ranch user guide的过程中,发现实现protocol handler需要使用特殊的gen_server形式,也就是enter_loop函数调用,事例代码如下: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 -module(echo_protocol). -behaviour(ranch_protocol).    -e…
1.简介 Gen_server实现了通用服务器client_server原理,几个不同的客户端去分享服务端管理的资源(如图),gen_server提供标准的接口函数和包含追踪功能以及错误报告来实现通用的服务器,同时可以作为OTP监控树的一部分. Gen_server函数与回调函数之间的关系: gen_server moduleCallbackmodule -------------------------------- gen_server:start_link ----->Module:ini…
问题由来 前些天对系统做了一个优化,将原来从queue 轮询刷出数据后每条消息一个 spawn 进程单独处理,修改为批量刷出.一条一条刷轮询刷 queue 存在问题:刷queue 进程太多时,占用CPU,刷queue 少时容易受网络延时影响.修改后,queue 中数据越多,batch 数越大,提高刷queue速度. 但问题随之而来:erlang节点,进程数蹭蹭往上涨,CPU 占用很低,直到 outofmemory, 节点remsh 无法连接. 问题排查 通过kill -SIGUSR1 PID 创…
在分析完gen module (http://www.cnblogs.com/--00/p/4271386.html)之后,就可以开始进入gen_server 的主体module 了.gen_server 的主体 module 暂不涵括terminate, hibernate, debug trace 相关的内容,这些会单独拉出来分析. gen_server 主要包括start 初始化部分, MAIN loop. 其中MAIN loop 为gen_server的主体结构, 其中,处理Label…
1.简介     Erlang要编写高容错性.稳定性的系统,supervisor就是用来解决这一问题的核心思想.通过建立一颗监控树,来组织进程之间的关系,通过确定重启策略.子进程说明书等参数信息来确定佣程与督程的行为,以及在发生故障时的处理办法.简单介绍supervisor的API:        start_link(Module, Args) -> startlink_ret()      start_link(SupName, Module, Args) -> startlink_ret…
gen_server 概要: 通用服务器行为描述: 行为模块实现服务器的客户端-服务器关系.一个通用的服务器进程使用这个模块将实现一组标准的接口功能,包括跟踪和错误报告功能.它也符合OTP进程监控树.了解更多信息参考OTP设计原则. gen_server假定所有特定部分位于一个回调模块,它导出的一组预定义的功能.行为函数和回调函数的关系可以说明如下: gen_server module Callback module ----------------- --------------- gen_s…
本文主要记录各种情况下gen_server进程退出的表现. 研究动机起源于Elixir/Phoenix框架中遇到的一个进程异常退出问题.因为网络异常,客户端超过一段时间未发来消息,channel进程(一个gen_server)退出了,但是挂的很突兀,不调用 terminate,进而导致掉线处理没被调用,表现出一堆bug.分析发现它是被shutdown的,而一个gen_server如果没有trap_exit,被shutdown就不会调用terminate. Anyway,实验了各种组合,仅以此做个…
不论是新手还是熟手,写gen_server时常会遇到terminate/2,有时执行,有时却不执行的困惑. 比如stackoverflow中的Handling the cleanup of the gen_server state,因为terminate的文档写得比较模糊,并没有给出如何让terminate/2一定会被执行的方案. 为了理顺各种情形,做了个小实验,结论如下: 让进程退出的来源有二种: 内部原因,自己运行完退出或发生异常crash退出. 外部原因,使用erlang:exit/2强制…
官方资料参考: Module:terminate(Reason, State) Types: Reason = normal | shutdown | {shutdown,term()} | term() State = term() This function is called by a gen_server when it is about to terminate. It should be the opposite of Module:init/1 and do any necessa…
前段时间项目改代码突然cpu波动很大,排查了好久都没有找到原因,只能求助于性能测试工具 :   <<Erlang程序设计>>----Joe Armstorng[哈哈,登月第一人也叫Armstrong] P416 cprof测试每个函数被调用了多少次,这个工具为轻量在运行系统上使用这个工具会给系统带来5%~10%的额外负载 fprof显示函数调用和被调用的埋单,并将结果输出到一个文件中,这个工具比较适合于在实验环境或模拟环境中对进行大规模的性能前一段,它会带来非常显著的系统负载. e…