erlang reduction

  “首先明确一点,Erlang的process的调度是抢占式的,而非couroutine的协作式的。其次,Erlang早期版本是只有一个调度器,运行在一个线程上,随着erts的发展,现在erlang的调度器已经支持smp,每个cpu关联一个调度器,并且可以明确指定哪个调度器绑定到哪个cpu上。第三,Erlang的调度也是采用优先队列+时间片轮询的方式,每个调度器关联一个ErtsRunQueue,ErtsRunQueue内部又分为三个ErtsRunPrioQueue队列,分别对应high,max和normal,low的优先级,其中normal和low共用一个队列;在Erlang中时间片是以reduction为单位,你可以将reduction理解成一次函数调用,每个被调度的process能执行的reduction次数是有限的。调度器每次都是从max队列开始寻找等待调度的process并执行,当前调度的队列如果为空或者执行的reductions超过限制,那么就降低优先级,调度下一个队列。”---迄今为止找到最好的解释reduction了。但是这里还是需要日后去证实的!包括每个优先级额定reduction是多少?因为目前测试每次调用reduction都在不断的增加,这意味着系统存在一个“标准”来定义上次进程执行的reduction和本次调用时reduction的差值。一旦这个差值超过额定reduction,该进程就会被挂起,被调度。

--------------------追加:为什么第一时间没有去看官方文档  ~ >.< ~ -----------------------

官方文档:

erlang:bump_reductions(Reductions) -> true

Types:

Reductions = integer() >= 1

This implementation-dependent function increments the reduction counter for the calling process. In the Beam emulator, thereduction counter is normally incremented by one for each function and BIF call, and a context switch is forced when the counter reaches the maximum number of reductions for a process (2000 reductions in R12B).

Scheduling is preemptive. Regardless of priority, a process is preempted when it has consumed more than a certain amount of reductions since the last time it was selected for execution.

  意思就是说每次函数调用或者bif调用都会增加reduction的值。在R12B中额定值是2000。(当前reduction) - (本次进程获得资源一开始的reduction) > 2000 不论优先级强行调度!

ps:只有在程序中才能存在绝对的公平~~~

时间: 2024-10-29 10:46:08

erlang reduction的相关文章

Erlang ERTS的Trap机制的设计及其用途

出处:http://mryufeng.iteye.com/blog/334744 erlang的trap机制在实现中用的很多,在费时的BIF操作中基本上都可以看到.它的实现需要erl vm的配合.它的作用基本上有3个: 1. 把费时操作分阶段做.由于erlang是个软实时系统,一个进程或者bif不能无限制的占用cpu时间.所以erlang的每个进程执行的时候,最多只能执行一定数量的指令.这个是设计方面的目标.实现上也要配套.所以比如md5,list_member查找这种可能耗时的操作都是用tra

Erlang tool -- recon

遇见recon 以来, 每次定位系统瓶颈, 总是能让我眼前一亮. 比如说, 定位非尾递归导致的内存暴涨, 定位引发CPU满载的进程.得心应手,每每额手称庆. recon 是ferd 大神 释出的一个 用于生产环境诊断Erlang 问题的一个工具, 不仅仅是对Erlang stdlib 接口的封装, 还有memory fragmentation 相关的函数. CPU 统计相关 在ferd 大神放出的 Erlang_In_Anger 中提到了 The reduction count has a di

探讨erlang消息选择性接收和改进

从 rabbitMQ 代码中找到 gen_server2 , 对gen_server进行了一些优化.看到前辈写的博文也提到这个,引发了我的思考.见 gen_server2 - OTP gen_server优化版 . gen_server2 引发的思考 正如 litaocheng 所说的: gen_server 和 gen_server2 最大的不同是: gen_server2 收到任何一条消息放到外部的队列中,当VM内部消息队列为空后,才进行消息处理,继续循环 gen_server 收到任何一条

erlang send剖析及参数意义

erlang send是一个很基础的消息发送函数,用于进程把一个消息发给另外一个进程.这个函数可以同时用于本地节点进程通信,或者和远程节点进程之间的通信. 前言 最近有同事遇到erlang:send导致消息堆积问题,这个引起了我的强烈关注.我也看了这块的代码,这里简单做个分享. 函数原型: erlang:send(Dest, Msg, Options) -> Res Options可以是以下2个: nosuspend If the sender would have to be suspende

硝烟中的Erlang -- Erlang生产系统问题诊断、调试、解决指南

英文原名:Stuff Goes Bad: Erlang In Anger 英文作者:FRED HEBERT 下载地址:http://vdisk.weibo.com/s/iGQ-rFuJU0-4 译者序 在我近20年的软件开发工作中,除了Erlang,还使用过许多其他编程语言.有工作需要的C/C++.Java,也有作为业余爱好使用的Lisp.Haskell.Scala等,其中我最喜欢的当属Erlang.除了因为我的电信软件开发背景外,还有一个很重要的原因是Erlang独特的设计哲学和解决问题方式.

不是语言之争--Go vs Erlang

因为 云巴 系统对高并发.低延迟的需求,我们对各个语言.平台做了很多的调研比较工作.这自然就包括致力于开发高并发应用的 Go 和 Erlang. 并发 Go 对高并发的支持通过 goroutine 实现.goroutine 可以理解为轻量级的 线程(thread).同一个 Go 应用创建的 goroutine 共享地址空间. Erlang 的高并发通过轻量级 进程(process)实现,每一个进程都有独立的状态记录. 另外,使用 goroutine 要注意,goroutine 运行完毕后,占用的

[Erlang_Question21]Erlang性能分析工具eprof fporf的应用

前段时间项目改代码突然cpu波动很大,排查了好久都没有找到原因,只能求助于性能测试工具 : <<Erlang程序设计>>----Joe Armstorng[哈哈,登月第一人也叫Armstrong] P416 cprof测试每个函数被调用了多少次,这个工具为轻量在运行系统上使用这个工具会给系统带来5%~10%的额外负载 fprof显示函数调用和被调用的埋单,并将结果输出到一个文件中,这个工具比较适合于在实验环境或模拟环境中对进行大规模的性能前一段,它会带来非常显著的系统负载. epr

为什么我要选择erlang+go进行服务器架构

服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 估计很多同学看到这里都会觉得迷惑,go的大名已经如雷贯耳了,但是erlang?这个东东是神马?难道是编程语言?怎么从来没听说过. 这里请允许我先介绍一下使用Erlang开发的比较有名的应用: 一:whatsapp 只凭32个技术人员,如何应付4.5亿的用户?对于刚刚被Facebook用190亿美元收购的WhatsApp来说,答案是Erlang--一种诞生于上世纪80年代的编程语言,终于在此时走到了聚光灯下.

Erlang生成式实现的列表去重、求交集及并集

%集合去重,Acc初始传入为[],存放的是最终的结果 delSame([],Acc) -> Acc; delSame([Pre|T],Acc) ->checkSame([X||X<-T,X=/=Pre],Acc++[Pre]). %求交集 crossList(L1,L2) -> [X||X<-L1,Y<-L2,X=:=Y]. %求并集 mergeList(L1,L2)-> delSame(lists:merge(L1,L2),[]). 总结:(1)erlang的生