erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”
为过载做计划
到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽。而且通常都和过长的消息队列有关37。解决这类问题的方法有很多,不过只有在深入、全面的理解系统后,才能做出正确的选择。 基本上,我从事的所有项目都可以简化类比成一个非常大的浴室水槽。用户请求和数据从龙头流入。Erlang系统则是水槽和管道,可以把水流出的地方(数据库,外部API或者服务,等等)看作是下水道系统。

当Erlang节点由于队列溢出而死亡时,找到原因所在是至关重要的。是流入槽中的水太多了吗?是下水道堵塞了吗?还是把管道设计得太细了? 要找到膨大的队列并不是件难事,这个信息可以从crash dump中获得。知道队列膨大的原因则要困难得多。根据进程的角色,或者做些运行时的检查,就可以找出一些可能的原因:消息泛滥,进程阻塞无法快速处理消息,等等。
决定如何修复是最困难的部分。由于对水的滥用导致水槽积水时,我们可以换一个大一些的水槽(程序中崩溃的部分,处于边缘)。接着,发现水槽出水口太小,优化它。再接着发现管道太细,优化它。负载一直被推向系统的下游,直到下水道无法承受。此时,我们可能会试着增加水槽或者增加浴室来缓解这个全局性的输入问题38。
不过,事情总会发展到无法在浴室层面解决的地步。发出的日志过多,要保持一致性的数据库成为了瓶颈,或者只是因为公司没有解决问题所需的知识或者人力。
只有到了此时,我们才找到了系统的真正瓶颈所在,前面所做的优化虽然都不错(并且成本也不低),不过可能没啥用。 我们需要更聪明一些,退后一步,在上游解决问题。可以对进入系统的信息做些处理,让它更轻量一些(可以通过压缩,用更好的算法和数据表示,缓存等等)。 即使这样,还是会出现系统负载过大的情况,此时我们不得不在限制系统输入,丢弃输入,或者接受系统在崩溃前会持续降低服务质量之间做出艰难的选择。这些机制隶属于两种大的策略:反压(back-pressure)和减载(load-shedding)。
erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”的更多相关文章
- erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"
对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...
- erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”
error_logger 爆炸 具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一.在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比 ...
- erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”
1.大家听说Erlang,往往是因为其对高并发的良好支持.其实,Erlang的核心特征是容错,从某种程度上讲,并发只是容错这个约束下的一个副产品.容错是Erlang语言的DNA,也是和其他所有编程语言 ...
- erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”
如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题. 最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面.在执行此类阻 ...
- .Net中的AOP读书笔记系列之AOP介绍
返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...
- 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)
1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算 估算生产率/实际生产率 看看团队的历史,看看他们在过去几个sprint里的生产率是多少 然后假定在下一个sp ...
- 《软件测试52讲》读书笔记 —— API测试怎么做
前言 文章中还介绍了测试工具,比如cURL.postman,单API如何测试:但这些都是偏基础的东西,且网上教程各式各样,就不再赘述了:这里主要讲的就是关于复杂场景的API测试要如何应对 API测试的 ...
- 重构(Refactoring)技巧读书笔记(General Refactoring Tips)
重构(Refactoring)技巧读书笔记 之一 General Refactoring Tips, Part 1 本文简要整理重构方法的读书笔记及个人在做Code Review过程中,对程序代码常用 ...
- ITEYE中的读书笔记:重构其实就是持续改进
原文地址:http://hawkon.iteye.com/blog/2093338#bc2355877 前段时间同事参加ITEYE的试读有奖, 没想到得了个奖,拿到一本书.由于同事的推荐我也认真读了一 ...
随机推荐
- [C# 开发技巧系列]如何动态设置屏幕分辨率
首先,大家应该明确,现在没有可用的API来给我们动态地设置屏幕分辨率,我们要实现这个需求,我们只能在C#程序中调用Win32 API 函数来解决这个问题的,这里用C#代码调用Win32 API 就涉及 ...
- Maven 一段时间知识小结2
父 Pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>s ...
- SPSS 分布类型的检验
假设检验的标准步骤: 1.建立假设:根据问题的需要提出原假设H0,以及其对立面备择假设H1. 2.确立检验水准:即设立小概率事件的界值α. 3.进行试验:得到用于统计分析的样本,以该试验的结果作为假设 ...
- Lucene 初步 之 HelloWorld
万恶的源头 HelloWorld 要完成lucene 的配置 需要几个jar包 (如果需要可以留言我私发) 创建索引API分析: 1. Directory: 类代表一个Lucene索引的位置,FSDi ...
- spring mvc: json练习
spring mvc: json练习 本例需要用到的json包: 如下: jackson-databind jackson-core jackson-annotations <!-- https ...
- 浅谈java中源码常见的几个关键字(native,strictfp,transient,volatile)
最近看源码总发现一些没见过的关键字,今天就来整理一下native,strictfp,transient,volatile native 本地 native是与C++联合开发的时候用的!java自己开发 ...
- 设计模式--解释器模式C++实现
1定义 给定一门语言,定义他的文法的一种表示,并定义一个解释器,该解释器使用该表示来解释语言中的句子 2类图 角色分析 AbstractExpression抽象解释器,具体的解释任务由各个实现类完成, ...
- js排序算法01——冒泡排序
在codewars上面刷题卡住刷不下去了,意识到自己算法方面的不足,准备写一些算法方面的文章,此为一. 冒泡排序是很常见简单的算法了,每次比较任何两个相邻的项,如果第一个比第二个大,则交换他们,就像气 ...
- C++进阶2. typedef用法
C++ 中的typedef用法 20131011 Typedef在C++中是一个关键字,他的用法有多重,但是自己又说不全面,所以整理一下: 1.用类型的别名 typedef char* PChar; ...
- poj21516
首先对于一种商品 如果这种货不足需求就直接输出-1 剩下的就是KM算法 分k次分别计算每种商品的最小权值匹配 代码: #include<cstdio> #include<cstrin ...