erlang 提供了简单易用的并发编程模型,基本不需要再考虑多线程并发问题。但实际应用中并不是那么的完美,很多地方需要注意,就算标准库也有不少问题。很多在多线程编程中很多很容易解决的事情,在erlang中是那么的蛋疼和无奈。erlang专注于自己擅长领域,本身十分健壮,强大的shell,分布式特性,让我们更专注于业务实现;但因缺乏文档、足够的经验资料,初入时很容易用出各种问题。

  1.进程message_queue_len

   很多问题归根结底都处在message_queue_len 太长,每个进程都带着一个buffer 无限的queue,嗯,来着不拒。

   queue 因为各种各样原因消费不过来,经典的gen_server port 调用receive_match 问题, 越来越长,越长越慢,OOM...

   进程数高,数十万百万级别时更容易出问题

   列举解决方案:

   - 日志组件

    errror_logger 很坑,使用lager 关闭crash_log, sync_on none, file_backend 只能用于测试环境,使用自定义scribe_backend 将日志通过网络收集到中心日志服务器。

   - dns 解析

    一次erlang 节点CPU严重波动排查

  - gen_server

    改用rabbitmq-server 提供的gen_server2

  

  2. 热点进程

    不像多线程模型,一个执行流内路径都由一个线程完成,而是分布到多个进程,而一个进程最多使用一个核心。

    一个进程活儿干不过来,那就使用多个进程一组来完成,要做分发(这个很蛋疼啊)。能用ets 就用ets,不行只能分组了。

    -   进程优先级调高

      process_flag(priority, high)

    -   discard

      process_info(self(), message_queue_len) 控制流量,必要的时候discard 部分

    -  合包

      消息传递是有成本的,receive {'gen_cast', Msg} 多次合包处理也是提高并发好办法

    - supervisor

     此进程也容易造成热点,必要proc_lib:spawn 方式,有些场景去掉supervisor 节省内存同时去除热点

   3. 公平调度

    erlang 是公平调度的,尤其在高进程数节点内,热点进程设置高优先级是必须的,线上使用依赖库很多都有此改动。

    否则会出现,CPU 很低,但是业务处理不过来,很多call timeout 问题

    - 避免使用rpc:call

       erlang 虚机crash 提到,使用自己的gen_call 实现,OTP rpc 使用rex 单进程提供服务,进程优先级无法调整,请求量稍微一高就莫名的timeout。

    - swt low

     erlang 内部统计reductions 对于bif不准确,可能会存在cpu 很低,但业务依然timeout,提高调度器唤醒敏感度

  4. 流控

   因为消息队列原因,来着不拒,虚拟crash 大多因为 OOM,所以流控非常有必要

   - message_queue_len

    过长时,discard 策略,或server busy 应答

  -  memory

    erlang:memory(total)/ SysMem(参考rabbit_memory_monitor) > 70% 后开始拒绝请求

    为啥是70%呢?erlang:memory(total) 为实际使用内存,不保留无法使用的碎片,70% 很保守,必要应考试60%以下

   

  5. 系统日志

   一旦出现OOM,crash_dump 是无法生成的,shell也基本进入无望,所以必要的系统日志提供事后分析

     erlang 没有提供进程队列阀值通知机制,那么只能是定时轮了

    根据进程数量: registered() < release_handler_1:get_supervised_procs() < processes()  选取不同频率定时check,配合报警。

erlang 健壮性的更多相关文章

  1. 安装第三方Python模块,增加InfoPi的健壮性

    这3个第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 目录 1.cchardet    自动检测文本编码 2.lxml    用于解析 ...

  2. 基于 fuzz 技术验证移动端 app 的健壮性

    问题定义 app发布后经常容易出现各种诡异的crash, 这些crash固然可以通过各种崩溃分析服务去定位. 但是的确很影响用户体验. 在crash分类中有一类是后端接口引发的. 比如常见的引发app ...

  3. strcpy之代码的健壮性与可维护性

    strcpy   函数的原型是: char * strcpy(char * strDest,const char * strSrc);    功能:把从strSrc地址开始且含有NULL结束符的字符串 ...

  4. bug:论用例健壮性的重要

    最近出了2个类似问题,此处写下,以作为警醒 问题1: 背景:电商类网站,为了增加用户回流,增加用户购买力度,做了一个和用户等级相关活动 需求:用户等级为g0 -g5,现在有一批代金券有等级领取限制.用 ...

  5. TestOps - 最健壮性的测试角色

    一十一 发表于 2018-03-02 09:10:08 TestOps   最具影响力的测试运维一体化综合平台. DevOps实现了从代码到服务的快速落地,而TestOps集成了DevOps效率,更是 ...

  6. 使用 const 提高函数的健壮性

    使用 const  提高函数的健壮性 看到 const 关键字,C++程序员首先想到的可能是 const 常量.这可不是良好的条件 反射.如果只知道用 const 定义常量,那么相当于把火药仅用于制作 ...

  7. java鲁棒性(健壮性)

    java能检测编译和运行时的错误 java自己操作内存减少了内存出错的可能 java实现了真数组,避免了覆盖数据的可能 Java不支持指针操作,大大减少了错误发生的可能性 ... 备注: Java能运 ...

  8. 程序try-catch的绝对健壮性之嵌套

    写程序的过程中,我们对try-catch在熟悉不过了,捕获异常进行处理,以保证程序的健壮性. 今日突发一想,如果我们catch中的代码异常了怎么办?我们做以下一种假设 static void Main ...

  9. 使用moneykey对APP进行健壮性测试

    注意:moneykey对app按钮伪随机点击,只能测试app稳定性和健壮性,无法进行常规测试 1.安装 A.jdk(不详细介绍) B.安装配置android配置环境:Android Studio 此环 ...

随机推荐

  1. C#中的WebBrowser控件的使用

    0.常用方法   Navigate(string urlString):浏览urlString表示的网址 Navigate(System.Uri url):浏览url表示的网址 Navigate(st ...

  2. 拷贝excel里的内容转为JSON的js代码

    <!DOCTYPE html> <html lang="en"> <head> <title>excel转json</titl ...

  3. html javascript css3 php3.2.3离线手册

    各位新年快乐! 愿大家"愿有前程可奔赴,也有岁月可回头"! 发现个离线手册很全的网站,分享大家,也mark自用. http://www.shouce.ren/ 手册网

  4. IE兼容方法

    其实我也觉得非常麻烦,开始的时候都用 _XXX:XXX; /* IE6支持 */ *XXX:XXX; /* IE6.IE7支持 */ *+XXX:XXX; /* IE7支持 */ XXX:XXX\9; ...

  5. CodeForces 698C LRU

    吐槽一句:这数据造得真强-. 题意:有一个大小为k的缓存区,每次从n种物品中按照一定的概率选取一种物品尝试放进去.同一个物品每一次选取的概率都是相同的.如果这种物品已经放进去过就不再放进去.如果缓存区 ...

  6. 10个常见的Node.js面试题

    如果你希望找一份有关Node.js的工作,但又不知道从哪里入手评测自己对Node.js的掌握程度. 本文就为你罗列了10个常见的Node.js面试题,分别考察了Node.js编程相关的几个主要方面. ...

  7. PHP进程通信基础——信号

    PHP进程通信基础--信号 使用信号通信.可以使用kill -l 来查看当前系统的信号类型. 每个信号所代表的的详细含义,请查看我的这篇博客:http://www.cnblogs.com/roverl ...

  8. PHP 信号管理

    .note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...

  9. Clean Old Kernels on CentOS

    1. Check Installed Kernels $ rpm -q kernel 2. Clean Old Kernels ## need Install yum-utils ## ## Pack ...

  10. W3Help-兼容性-知识库

    http://www.w3help.org/zh-cn/kb/ clear:none/left/right/both/inherit该特性表明元素框的哪一边不可以和先前的浮动框相邻.'clear' 特 ...