error_logger 爆炸

  具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一。在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比错误产生的速度慢得多。尤其是在记录用户产生的日志消息(不是错误)或者大量进程崩溃时,更是如此。对于前者,是因为error_logger本来就不适用于记录高度连续的消息。它只适用于真正的异常情况,并不期望过多的消息量。对于后者,是因为崩溃进程的完整状态(包括其消息邮箱)都会拷贝出来进行日志记录。这种消息无需太多,就会耗费大量内存,即使不能立即造成节点内存耗尽(OOM),也足以减慢logger的处理速度,使得后续消息不断累积,导致最终的内存耗尽。

  到目前为止,最好的解决方案是使用另外一个日志库:lager。   虽然lager不能解决所有的问题,但是它会删节掉巨大的日志消息,会在超过门限时选择性的丢弃掉OTP产生的错误消息,并且会在用户提交消息时自动地在同步、异步模式间切换,以达到自我调控的目的。   对于有些极端情况,lager也无能为力,比如:用户提交的消息非常巨大,并且都来自一次性进程。不过,这种情况非常少见,而且此时程序员往往具有更多的控制权。

注:目前我理解的方法是,在高度密集的日志需求下实现自定义的日志管理模块,采用“去军保帅”的做法,给消息队列设置高低水位线,超过就丢弃一定的消息。

erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”的更多相关文章

  1. erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"

    对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...

  2. erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”

    为过载做计划 到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽.而且通常都和过长的消息队列有关37.解决这类问题的方法有很多,不过只有在深入.全面的理解系统后,才能做出正确的选择. ...

  3. erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”

    1.大家听说Erlang,往往是因为其对高并发的良好支持.其实,Erlang的核心特征是容错,从某种程度上讲,并发只是容错这个约束下的一个副产品.容错是Erlang语言的DNA,也是和其他所有编程语言 ...

  4. erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”

    如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...

  5. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

  6. 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)

    1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算  估算生产率/实际生产率  看看团队的历史,看看他们在过去几个sprint里的生产率是多少  然后假定在下一个sp ...

  7. ITEYE中的读书笔记:重构其实就是持续改进

    原文地址:http://hawkon.iteye.com/blog/2093338#bc2355877 前段时间同事参加ITEYE的试读有奖, 没想到得了个奖,拿到一本书.由于同事的推荐我也认真读了一 ...

  8. 《编写可维护的javascript》读书笔记(中)——编程实践

    上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...

  9. 《Android源代码设计模式解析》读书笔记——Android中你应该知道的设计模式

    断断续续的,<Android源代码设计模式解析>也看了一遍.书中提到了非常多的设计模式.可是有部分在开发中见到的几率非常小,所以掌握不了也没有太大影响. 我认为这本书的最大价值有两点,一个 ...

随机推荐

  1. Dokcer ELK

    使用 docker 搭建 ELK  非常简单 docker run --name myes -d -p 9200:9200 -p 9300:9300 elasticsearch:2.4.4   运行  ...

  2. url拼接

    在做网页抓取的时候经常会遇到一个问题就是页面中的链接是相对链接,这个时候就需要对链接进行url拼接,才能得到绝对链接. url严格按照一定的格式构成,一般为如下5个字段: 详细可参考RFC:http: ...

  3. Entity Framework 中 Schema是什么

    在使用Entity Framework时,会注意到下面这句: protected override void OnModelCreating(DbModelBuilder modelBuilder) ...

  4. python 这个stdin怎么写

    !/usr/bin/env python -- coding: utf-8 -- import json import pprint import sys reload(sys) sys.setdef ...

  5. Struts2框架学习第一章——Struts2概述

    本章要点 —  Web应用的发展 —  Model 1和Model 2 —  MVC思想 —  MVC模式的优势 — 常用MVC框架及其特征 —  Struts 1的基本结构及其存在的问题 —  We ...

  6. python+opencv链接摄像头

    import cv2 import numpy as numpy cap=cv2.VideoCapture(0) #设置显示分辨率和FPS ,不设置的话会非常卡 cap.set(cv2.CAP_PRO ...

  7. mina-deploy(3800🌟) 快速部署工具

    Mina  (3800

  8. SSM的Maven项目搭建过程

    POM文件 父项目管理jar包,pom <modelVersion>4.0.0</modelVersion> <groupId>cn.e3mall</grou ...

  9. python 细节回顾

    #!/usr/bin/python # -*- coding: UTF-8 -*- for letter in 'Python': # 第一个实例 if letter == 'h': continue ...

  10. 【hive】子查询

    hive中是不支持子查询的 但是并不意味这不支持in 或者 not in in 或者not in 后边是定值的话是支持的 但是接定制是可以的 例如 select id from table not i ...