erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”
如果某个进程需要持续地接收新任务,那么其在执行耗时过长的锁或者阻塞操作时,就会出现问题。
最为常见的例子之一就是:某个进程使用了TCP socket,阻塞在了接收新的连接或者等待消息上面。在执行此类阻塞操作时,消息会不受限制地堆积在消息队列中。 一个更为糟糕的例子是我曾经为lhttpc库的某个分支写的http连接池管理器。在大多数测试用例下,它都工作正常,我们甚至把连接的超时时间设置为10ms,以确保不会耗费太多的时间40。正常工作了几周后,该HTTP连接池导致了一次服务中断,原因是有个远程服务器down机了。 这次恶化背后的原因是:当远程服务器down机后,突然之间,所有的连接操作都至少要耗费10ms的时间,也就是连接超时时间。每秒大约有9,000个消息发给中心进程,通常每个消息的处理时间在5ms之内,这个超时的影响等同于每秒18,000个消息,情况变得失控。 我们的解决方案是,把进行HTTP连接的任务放到调用进程中,并加以限制,感觉仍像是管理器自己在做这件事一样。现在,阻塞操作分布到库的所有使用者之中,管理器要做的工作更少了,可以接受更多的请求。
当程序中有任何一个点,最终成为接收消息的中心点时,耗时的任务要尽可能从中移出。对于可以预见的过载41,增加更多的进程(它们或者处理阻塞的操作,或者在主进程阻塞时充当缓冲)往往是个不错的方法。 如果某些活动并没有内在的并发要求,那么这种方法会增加进程管理方面的复杂性,所以在这样做之前要确定自己确实有这个需要。 另外一种做法是,把阻塞任务变成异步的。如果场景适用,服务器可以启动一个进程来执行耗时(等待资源)的任务,赋予该进程一个唯一的令牌,把令牌和原始请求者保存起来。当资源可用时,这个进程会把令牌附带在消息中发送给服务器。服务器最终会得到这个消息,通过令牌匹配原始请求者,并发送回应,期间不会被其他请求所阻塞42。 这种做法要比使用多个进程的方法更晦涩一些,也很容易造成回调地狱(callback hell),但是使用的资源要更少些。
erl_0017 《硝烟中的erlang》 读书笔记004 “锁和阻塞”的更多相关文章
- erl_0019《硝烟中的erlang》 读书笔记005 “进程信息"
对一个运行中的Erlang系统来说,进程绝对是重要的组成部分.正因为进程是所有运行实体的基础,因此会想去了解它们的更多信息.幸运的是,VM提供了大量的可用信息,其中有些可以安全使用,有些在生产环境中使 ...
- erl_0016 《硝烟中的erlang》 读书笔记003 “error_logger 爆炸”
error_logger 爆炸 具有讽刺意味的是,负责错误日志的进程竟然是最为脆弱的之一.在Erlang的缺省安装中,error_logger39负责记录日志(写入磁盘或者发送到网络上),它的速度要比 ...
- erl_0015 《硝烟中的erlang》 读书笔记002 “为过载做计划”
为过载做计划 到目前为止,我在实际工作中所碰到最常见的错误,基本上都是节点内存耗尽.而且通常都和过长的消息队列有关37.解决这类问题的方法有很多,不过只有在深入.全面的理解系统后,才能做出正确的选择. ...
- erl_0014 《硝烟中的erlang》 读书笔记001 “绪论”
1.大家听说Erlang,往往是因为其对高并发的良好支持.其实,Erlang的核心特征是容错,从某种程度上讲,并发只是容错这个约束下的一个副产品.容错是Erlang语言的DNA,也是和其他所有编程语言 ...
- .Net中的AOP读书笔记系列之AOP介绍
返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...
- 硝烟中的scrum学习笔记 - 怎样制定Sprint计划(Plan Meeting)
1. 如何估算我们这个sprint能做多少个故事点 1) 本能反应 2) 生产率计算 估算生产率/实际生产率 看看团队的历史,看看他们在过去几个sprint里的生产率是多少 然后假定在下一个sp ...
- 《java并发编程实战》读书笔记8--死锁,性能与可伸缩性,锁粒度锁分解锁分段
第10章 避免活跃性危险 10.1 死锁 -10.1.1 锁顺序死锁 最简单的一种死锁形式: -10.1.2 动态的锁顺序死锁 可以通过下面的方法来解决: -10.1.3 在协作对象之间发生死锁 -1 ...
- ITEYE中的读书笔记:重构其实就是持续改进
原文地址:http://hawkon.iteye.com/blog/2093338#bc2355877 前段时间同事参加ITEYE的试读有奖, 没想到得了个奖,拿到一本书.由于同事的推荐我也认真读了一 ...
- 《编写可维护的javascript》读书笔记(中)——编程实践
上篇读书笔记系列之:<编写可维护的javascript>读书笔记(上) 上篇说的是编程风格,记录的都是最重要的点,不讲废话,写的比较简洁,而本篇将加入一些实例,因为那样比较容易说明问题. ...
随机推荐
- 面试笔试总结(一)之 C++基础
C++ 1.智能指针 内存管理 垃圾回收 指针问题 资源管理(内存就是资源) 可以通过引用计数的机制...实现内存回收,不要让内存泄漏. 涉及到内存的泄露的问题: 当创建一个对象的时候(new)而在对 ...
- 教你如何使用理解懒Redis是更好的Redis
前言 大家都知道 Redis 是单线程的.真正的内行会告诉你,实际上 Redis 并不是完全单线程,因为在执行磁盘上的特定慢操作时会有多线程.目前为止多线程操作绝大部分集中在 I/O 上以至于在不同线 ...
- Win10配Theano环境和Keras框架
网络上有各种各样的win7 64bit安装theano的方法,我也试过好多,各种各样的问题.因为之前没了解过MinGw等东西,所以安装起来比较费劲,经过不断的尝试,最终我按照以下过程安装成功. 其实过 ...
- css实现标题文字过长截取...
css实现网页中文字过长截取... title class应该这样写: .title{ width:300px; white-space:nowrap; overflow:hidden; text-o ...
- Spring自定义注解扫描的实现
目标:实现自定义spring自动扫描注解.主要为后期实现分布式服务框架自动注解提供技术支持 技术分析:通过配置组件扫描标签使spring解析标签. 1. JewelScanBeanDefaultPar ...
- 备注Quartz触发器设置
corn表达式时间格式: <!-- s m h d m w(?) y(?) -->, 分别对应: 秒>分>小时>日>月>周>年, ●星号(*):可用在所 ...
- vim编程技巧
1, :E 浏览目录 如果你要改变当前浏览的目录,或是查看当前浏览的目录,你可以使用和shell一样的命令: :cd <dir> – 改变当前目录 :pwd - 查看当前目录 2, :l ...
- Python实现CSV数据的读取--两种方法实现
方法一: 方法二:
- 设计模式--装饰模式C++实现
装饰模式C++实现 1定义 动态地给一个对象添加一些额外的职责.就增加功能来说,装饰模式比生成子类更加灵活.可作为继承的替代 2类图 3实现 //构件 class Component { protec ...
- 总结网站Mysql优化
Mysql存储引擎 选择合适的存储引擎Innodb myisam myisam: 写入数据非常快,适合使用场合dedecms/phpcms/discuz/微博系统等写入.读取操作多的系统. inno ...