erlang 健壮性

  erlang 提供了简单易用的并发编程模型,基本不需要再考虑多线程并发问题。但实际应用中并不是那么的完美,很多地方需要注意,标准库也很坑人的;再者多线程编程很多很容易解决的事情,在erlang中是那么的蛋疼和无奈,嗯,erlang只是专注于自己擅长领域,慎入。

  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,配合报警。

时间: 2024-09-29 05:10:03

erlang 健壮性的相关文章

健壮性与可靠性

健壮性(鲁棒性)和可靠性是有区别的,两者对应的英文单词分别是 robustness 和 reliability.健壮性主要描述一个系统对于参数变化的不敏感性,而可靠性主要描述一个系统的正确性,也就是在你固定提供一个参数时,它应该是产生稳定的,能预测的输出.例如一个程序,它的设计目标是获取一个参数并输出一个值.假如它能正确完成这个设计目标,就说它是可靠的.但在这个程序执行完毕后,假如没有正确释放内存,或者说系统没有自动帮它释放占用的资源,就认为这个程序及其"运行时"不具备健壮性或者鲁棒性

采用[ICONIX] 方法实践分析和设计之四 [健壮性分析]

在前三章中通过(问题域)建模和用例分析之后,在许多的UML书中可能接下来就要进行时序图和协同图的绘制了.但是问题好像还没那么简单,因为这里有一条鸿沟还没有跨过去,正如下图所示:                    在我刚学开始学习 UML时,在拿到用例文本时要去画时序图总感觉有些别扭,不知如何才能将文本中的意思完全用图的形式表达出来,总是感觉分析出来的文本中缺了一些很重要的东西, 而这些被丢掉的对象最终可能会导致无法绘制时序图,但又找不出用例文本中到底还有什么东西被遗漏,最终导致设计瘫痪.后来

性能测试 - 响应 vs 延迟 vs 吞吐量 vs 负载 vs 扩展性 vs 压力 vs 健壮性

本文译自Niraj Bhatt 所著 Performance Testing - Response vs. Latency vs. Throughput vs. Load vs. Scalability vs. Stress vs. Stress vs. Robustness. 原文地址:https://nirajrules.wordpress.com/2009/09/17/measuring-performance-response-vs-latency-vs-throughput-vs-lo

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

问题定义 app发布后经常容易出现各种诡异的crash, 这些crash固然可以通过各种崩溃分析服务去定位. 但是的确很影响用户体验. 在crash分类中有一类是后端接口引发的. 比如常见的引发app crash的原因 接口自身变更, 接口失效或者超时, 比如用户进地铁 接口格式变更. 字段缺失 接口内容变更, int string格式搞错了. 某些字段原本是有值后来就变成了null 一旦出了问题, 后端背锅或者做兼容是常见的方案. 但是对于app自身来说,也需要加强健壮性测试. 健壮性的英文名

关于提高代码质量的思考之提高代码健壮性

接着上期的拓展性之后,今天谈谈代码的健壮性.代码的健壮性又称鲁棒性,是高质量代码的一个重要指标. 有人分析了印度软件行业比中国好的一个原因:印度的一个老程序员,月代码量在一千行左右,这一千行代码,算法平实,但都是经过仔细推敲,实战检验的代码,不会轻易崩溃的代码.我们的程序员,一天就可以写出一千行代码,写的代码简短精干,算法非常有技巧性,但往往是不安全的,不完善的.印度人的程序被称作:傻壮.但程序就得这样! 那么如何写出一个代码简短精干,算法非常有技巧性,而又非常安全的代码呢?我逛了很多论坛,发现

用ORACHK自动化检查数据库系统的健壮性

1.orachk工具主要用途 (1)主动检查您的整个软件在操作系统.CRS.数据库.高可用等层面中的严重问题,以便于IT部门整改,提升系统的稳定性 (2)对于您系统中存在的风险提供简单化和合理化的诊断和分析建议. (3)对系统中存在的健康风险提供汇总信息,并且能够向下钻取到特定的问题和对应的解决方案 (4)对检查结果进行量化评分(100分制),内容非常的全面,通过得分直观判断健康程度 2.运行注意要点 (1)orachk不支持在root用户下运行,需要在oracle或grid用户下运行 (2)如

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

这些第三方Python模块是可选的,不安装的话InfoPi也可以运行. 但是如果安装了,会增加InfoPi的健壮性. 1.chardet chardet可以自动检测文本的编码.如果安装了,可以用于自动检测网页.xml的编码. 安装命令: sudo pip3.4 install chardet 如果系统自带python 3.4或以上版本,可能提示没有pip3.4,换成pip-3.x(x为python的具体版本号)试试. chardet的项目页面: https://pypi.python.org/p

代码健壮性是真的好吗?

我在看一个视频,这个视频里写的代码有这个特点,那就是它把代码写的一个方法可以多次被调用或者说叫利用也可以;同时视频也在一致强调这一点;那我就疑惑了,代码健壮性就那么好吗? 首先,你要写的一个方法能实现不同的功能,在开始设计它的时候就要考虑到各个问题的方方面面,这个对精力应该也是一个很大的消耗吧:这些代码也许写的人能轻松的能读懂,但是如果是别人来读的话,那耗费的时间和精力应该是更大的:如果是更大型的软件,恐怕程序员都要白头了吧:这难道是炫耀技术吗?这个代价也太大了! 其次,现在电脑运算速度是很快的

论用例健壮性的重要

最近出了2个类似问题,此处写下,以作为警醒 问题1: 背景:电商类网站,为了增加用户回流,增加用户购买力度,做了一个和用户等级相关活动 需求:用户等级为g0 -g5,现在有一批代金券有等级领取限制.用户等级和代金券等级相同时,用户可领取到这张代金券:否则代金券显示"等级不符不可领取". 于是我设计用例时这样的: 代金券领取等级: 代金券1(领取等级0),g1(领取等级1) 用户等级:user1(用户等级go) , user2(用户等级g1) 即可以实现以下场景: user1 -->