1. Erlang 抢占式调度

Erlang实现公平调度基于Reduction Budget(运行次数限制)。每一个进程创建时初始reduction budget值为2000,任何Erlang系统中的操作都会消耗部分budget。当budget降低到0,该进程交出CPU使用权,被其他进程抢占。

函数调用、调用 BIF、进程堆垃圾回收、ETS 读写、发消息(目标邮箱堆积的消息越多,消耗越大),均会造成budget不同程度减少。例如函数调用,budget -1;发消息,根据对端mail box长度正比减少 。当mailbox长度过大时,budget消耗增加,中止发送消息。

2. 进程资源隔离

每个Erlang进程由PCB(进程控制块),stack (存储零散数据和指针信息)以及heap (存储复合数据,例如元组)组成。 Erlang进程是虚拟机级别的进程,非常轻量,初始化时只有2K左右。 由于Erlang进程资源的隔离性,每个进程的进程内存都会被独立GC,即对单个进程垃圾回收不会STW(stop the world)。
Erlang进程的private heap结构设计保证了进程之间的资源隔离,独立的GC保证了尽量少的垃圾回收抖动。当进程退出时,内存直接回收。这些机制都保证了Erlang的高可用性和软实时性。

<img src="https://pic1.zhimg.com/50/2b2c7696c344aa45aafd8e0247bd214c_hd.jpg" data-rawwidth="692" data-rawheight="478" class="origin_image zh-lightbox-thumb" width="692" data-original="https://pic1.zhimg.com/2b2c7696c344aa45aafd8e0247bd214c_r.jpg">
3. 进程优先级管理

上文提到Erlang调度器基于 Reduction Budget=2000的原理。当进程的reduction quantum被消耗完毕,或者进入wait状态,则进程停止。
每个调度器拥有3条队列,分别为:最大优先级队列,高优先级队列,正常+低优先级队列。Run queue length即每条队列内进程或接口的数量,其值是进程分配migration的依据之一。为了确保每个进程分配时间均匀和按顺序执行,Erlang采用 Round-Robin算法。

4. 调度器之间的管理

调度器的另一个重要功能为通过跨进程/跨核的work sharing/stealing来平衡负载。

在每个balance check周期内,其中一个调度器(简称Scheduler A)会审查所有其他调度器的负载情况,以此决定下个周期的活跃调度器数量。同时,Scheduler A计算出迁移限制量 (migration limit),即每个优先级队列可以支撑的迁移进程/接口数量。除此之外,Scheduler A也会给出迁移路线。在迁移和执行关系确定之后,活跃和非活跃的调度器之间通过其工作状态互相转换。例如,当系统全速运转时,拥有较少工作量的调度器将承担主要执行任务。下图为调度器的状态转换规则。

<img src="https://pic2.zhimg.com/50/95698aa34faa00bef2dc8858d60bd0f8_hd.jpg" data-rawwidth="584" data-rawheight="712" class="origin_image zh-lightbox-thumb" width="584" data-original="https://pic2.zhimg.com/95698aa34faa00bef2dc8858d60bd0f8_r.jpg">

正是通过极其精密的调度系统,Erlang能够保证在各种极端环境下真正执行抢占式多任务处理,精细化实现软实时概念。这在我们调研的多种语言中是最适用于高并发软实时场景的。其他基于协作的语言和系统,包括node.js, go, python等都无法与之匹敌。

参考资料:
1. 基于 Erlang/OTP 构建大规模实时系统
2. Characterizing the scalability of Erlang VM

 

Erlang调度器的更多相关文章

  1. Erlang调度器细节探析

    Erlang调度器细节探析 Erlang的很多基础特性使得它成为一个软实时的平台.其中包括垃圾回收机制,详细内容可以参见我的上一篇文章Erlang Garbage Collection Details ...

  2. Erlang 进程被抢占的条件——一个进程长时霸占调度器的极端示例

    最近研究 binary 的实现和各种操作对应的 beam 虚拟机汇编指令,发现有一些指令序列是不可重入的,比如说有的指令构造一个上下文(也就是某种全局状态),然后下一条指令会对这个上下文做操作(具体的 ...

  3. Erlang/OTP 17.0-rc1 新引入的"脏调度器"浅析

    最近在做一些和 NIF 有关的事情,看到 OTP 团队发布的 17 rc1 引入了一个新的特性“脏调度器”,为的是解决 NIF 运行时间过长耗死调度器的问题.本文首先简单介绍脏调度器机制的用法,然后简 ...

  4. 大数据之Yarn——Capacity调度器概念以及配置

    试想一下,你现在所在的公司有一个hadoop的集群.但是A项目组经常做一些定时的BI报表,B项目组则经常使用一些软件做一些临时需求.那么他们肯定会遇到同时提交任务的场景,这个时候到底如何分配资源满足这 ...

  5. [Spring]支持注解的Spring调度器

    概述 如果想在Spring中使用任务调度功能,除了集成调度框架Quartz这种方式,也可以使用Spring自己的调度任务框架. 使用Spring的调度框架,优点是:支持注解(@Scheduler),可 ...

  6. 编写简单的ramdisk(选择IO调度器)

    前言 目前linux中包含anticipatory.cfq.deadline和noop这4个I/O调度器.2.6.18之前的linux默认使用anticipatory,而之后的默认使用cfq.我们在前 ...

  7. 【Cocos2d-x 3.x】 调度器Scheduler类源码分析

    非个人的全部理解,部分摘自cocos官网教程,感谢cocos官网. 在<CCScheduler.h>头文件中,定义了关于调度器的五个类:Timer,TimerTargetSelector, ...

  8. [原创]cocos2d-x研习录-第三阶 特性之调度器

    在游戏中,经常会周期执行一些检测.操作或更新一些数据等,我们称之为调度.Cocos2D-x中将调度封装为类CCScheduler,方便在游戏开发中使用.我们一起来学习一下,CCScheduler具有哪 ...

  9. Storm-隔离调度器

    这个版本的亮点是新的“隔离调度器”,使得在一些拓扑中分享集群变得简单和安全.隔离调度程序允许您指定哪些拓扑应该“孤立”, 这意味着它们运行在集群中的一组专用的机器,没有其他的拓扑将运行.这些孤立的拓扑 ...

随机推荐

  1. json 报错'xxx is not JSON serializable'的处理方法

    场景: 报错: 原因: json不能对np.int64或者np.float64等类型进行序列化,可以通过自定义serializer或者直接类型转换来解决. 解决方法: 显式的把 date 转换成 in ...

  2. 内存溢出OutOfMemory

    https://blog.csdn.net/hzy38324/article/details/76719105 https://blog.csdn.net/u010833547/article/det ...

  3. DapperExtensions and Dapper.Contrib在表构架不是默认dbo时的处理 DapperExtensions and Dapper.Contrib with non-dbo Schema

    什么是数据库的Schema dbo是一个构架(schema),与sql2000不同的是,在sql2005中,表的调用格式如下:"数据库名.构架名.表名",同一个用户可以被授权访问多 ...

  4. 提升linux下TCP服务器并发连接数(limit)

    https://cloud.tencent.com/developer/article/1069900 1.修改用户进程可打开文件数限制   在Linux平台上,无论编写客户端程序还是服务端程序,在进 ...

  5. 织梦中在线显示pdf文件的方法

    如何在织梦中添加pdf文件并显示呢?下面这个教程将带领大家来操作.(注:手机版无法查看) 第一步:在系统-系统基本参数-附件设置中添加pdf格式 并且将大小调大 第二步:在核心-内容模型-普通文章中添 ...

  6. linux环境中,多个命令之间,通过&& ||执行,命令之间执行的逻辑是什么?

    需求描述: 最近在写一个脚本的时候,要判断一个文件是否存在,有怎么样,没有就创建,这个时候 看到了一个test 结合 || 或者 &&的写法,就查看了下资料记录下是怎么个玩法. 操作过 ...

  7. electron安装+运行+打包成桌面应用+打包成安装文件+开机自启动

    1.初始化node项目,生成package.json文件 npm init 2.安装electron,并保存为开发依赖项 npm install electron -D 3.根目录下新建index.j ...

  8. [Stats385] Lecture 05: Avoid the curse of dimensionality

    Lecturer 咖中咖 Tomaso A. Poggio Lecture slice Lecture video 三个基本问题: Approximation Theory: When and why ...

  9. 利用media query让背景图适应不同分辨率的设备

    随着上网方式的多样化,用户选择上网的工具不再仅是PC,而可以是手机,或者平板电脑.随之而来的问题是如何让网页适应不同分辨率,这给前端工程师们带来了新的挑战,其中重要的一点是如何让图片能在不同的分辨率下 ...

  10. day_6.10py面试题:访问百度的过程

    DNS : 解析域名 DHCP:一种协议,自动分配ip 发现局域网中没有ip的电脑分配ip 面试题: 访问百度的整个过程 打开浏览器,访问百度的过程: 1.我的电脑确定有无网关,arp得到默认网管ma ...