阅读更多

1顶
0踩

编程语言
导读:

Java编程中,调度Task、Actor通常采用ExecutorsExecutorService。对无状态的任务,通常可以很好的胜任。但对于大量并发的有状态任务,需要使用Actor模型。
Kontraktor是一个Java编写的轻量级高效Actor模型实现。可以直接暴露Actor提供TCP服务、WebService或者WebSockets,从JavaScript客户端调用Actor方法,用JavaScript实现Actor并通过Java调用。
对无状态小任务单元,Executors可以很好的胜任。比如将计算任务分担到多个CPU上。然而,对于运行中的大任务单元Job调度,Executors只能做到次优(sub-optimal)。例如Actor或轻量级进程的消息调度。

许多Actor框架或类似的并发框架使用Executor service批量调度消息。由于Executor service是上下文不敏感的,因此会将单个Actor/Task消息安排多个线程或CPU处理。这会导致访问Actor、Process或Task状态时经常出现缓存未命中(cache miss)的情况。更糟糕的是,因为每个新的“Runnable”会把先前处理的Task缓存冲掉,所以CPU无法维持缓存的稳定。使用忙循环(busy-spin)会带来第二个问题。如果框架使用忙循环读取自己的队列,每个处理线程的CPU负载会升到100%。

借助Kontraktor 2.0,我实现了一种不同的调度机制——使用简单的度量标准测试应用实际需要的CPU资源,再进行水平式扩充。



每个Actor会固定分配到一个Workerthread(“DispatcherThread”)。调度器会定期重新调度Actor,根据信息判断是否需要把它们移动到另一个工作线程。

由于算法过于复杂通常会带来更高的运行时开销,实际调度时采用了一种非常简洁的方式:


    [1]如果消费循环连续处理N个消息没有休息(目前设置N=1000),就认定该线程超载。
    [2]一旦线程标记为“超载”,只要SUM_QUEUED_MSG(线程A上运行的Actor)大于SUM_QUEUED_MSG(新创建线程B上的 Actor),信箱(mailbox)中消息最多的Actor会移动到新的线程(直到#Threads == ThreadMax)。
    [3]如果#Threads == ThreadMax,Actor会根据目前收到的消息和“超载”信息重新分配。

问题:

  • 如果处理消息的时间差别很大,对消息队列的统计会产生误导。一种改进是为每个消息根据定期分析设定加权。可以简单地用每个Actor加权乘以队列大小。
  • 对爆发式负载会有延时,延迟结束后所有可用的CPU才能被真正地使用。
  • JIT真正起效前会有延迟,这会导致错误的分析数据,从而将错误放大(一段时间后能恢复正常,实际情况并没有那么糟糕)。

性能

为了对比自动化调度与Actor线程固定方式的开销,我运行了Computing-Pi测试(可参照前一篇博客)。这些数据并没有展示局部性(locality)带来的影响,只对固定方式与自动化调度进行了比较。

测试1 手动为每个Pi计算Actor分配一个线程,
测试2 一旦监测到实际的负载,总起启动一个worker并且自动进行比例调整。



(注意:示例要求kontraktor2.0-beta-2及更高版本。如果parkNanos选项启用,kontraktor的比例调整会限制在2、3个线程)

该测试运行了8次,每次运行会都会增加thread_max。

测试结果:

Kontraktor Autoscale(通常运行1个线程,然后比例调整到N个线程)


1 threads : 1527
2 threads : 1273
3 threads : 718
4 threads : 630
5 threads : 521
6 threads : 576
7 threads : 619
8 threads : 668

Kontraktor为每个Actor指定固定个数的线程(参见上面源码中被注释的行)


1 threads : 1520
2 threads : 804
3 threads : 571
4 threads : 459
5 threads : 457
6 threads : 534
7 threads : 615
8 threads : 659

结论

运行结果的区别很大程度上可归结与比例调整带来的延迟。对负载明确的情况,预先安排的Actor调度会更有效率。然而,考虑到服务器收到的请求会不断变化,自动化地调度是一种高效的选择。

将Executors/FJ与上面的调度策略进行对比,测试它们各自的缓存(cache)效果是很有意思的。不幸的是,Kontraktor不具备基于ExecutorService的消息分发,也没有针对Akka的调度策略实现。

此外,还需要一个示例Actors管理私有状态才可以观察缓存效果。
  • 大小: 23.5 KB
  • 大小: 65.7 KB
来自: ImportNew
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • Lucene学习二:封装操作接口,实现删除、更新索引

    索引文件可以理解为一个数据库,既然是数据库那么就因该包含增删改查,在此我们先定义两个接口IndexInterfac和QueryInterface分别表示索引相关的操作和查询相关的操作 IndexInterface代码如下: import java.io....

  • Lucene学习笔记(二)--------构建索引

    构建索引对搜索内容建模文档和域文档是索引和搜索的原子单位,包含一个或多个域的容器,域则依次包含“真正的”被搜索内容。每个域都有一个标识名称(即一个文本值或二进制值)。将文档加入到索引中时,可以通过一...

  • LUCENE

    Lucene总的来说是:  一个高效的,可扩展的,全文检索库。 全部用Java实现,无须配置。 仅支持纯文本文件的索引(Indexing)和搜索(Search)。...说明Lucene是有索引和搜索的两个过程,包含索引创建,索引

  • Lucene从入门到熟悉(一)概念&建立索引

    1.Lucene 索引创建读取架构图

  • Lucene.net(4.8.0) 学习问题记录六:Lucene 的索引系统和搜索过程分析

    前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移。因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3.6.0 ,PanGu分词也是对应Lucene3.6.0版本...

  • Lucene7.4 初体验

    前言 本文的简要内容: Lucene简介 体验Lucene Demo ...Lucene通常用于全文检索,Lucene具有简单高效跨平台等特点,因此有不少搜索引擎都是基于Lucene构建的,例如:Elasticsearch,Solr等等。 现...

  • 使用Lucene.Net实现全文检索

    目录 ... Lucene.Net是一个C#开发的开源全文索引库,其源码包括“核心”与“外围”两部分。外围部分实现辅助功能,而核心部分包括: Lucene.Net.Index 提供索引管理,词组排序。Lucene.Net.Search 提

  • 基于Java的全文索引引擎Lucene简介

    在应用中加入全文检索功能 ——基于Java的全文索引引擎Lucene简介 作者: 车东 Email: chedongATbigfoot.com/chedongATchedong.com 写于:2002/08 最后更新: 11/22/2005 00:39:42Feed Back >>(Read ...

  • Lucene&ElasticSeach&Kafka

    Lucene&ElasticSeach&Kafka Lucene&ElasticSeach 1 什么是全文检索 1.1 数据分类 生活中的数据总体分为两种:结构化数据和非结构化数据。 ​ 结构化数据:指具有固定格式或有限长度的数据,如数据库,...

  • lucene.NET详细使用与优化详解

    lucene.NET详细使用与优化详解 1 lucene简介 1.1 什么是lucene Lucene是一个全文搜索框架,而不是应用产品。因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些...

  • Apache Lucene简介

    1.搜索引擎的历史萌芽:Archie、Gopher起步:Robot(网络机器人)的...(1)Lucene是非常优秀的成熟的 开源的 免费的纯 纯java 语言的全文索引检索工具包。全文检索:是指计算机索引程序通过扫描文章中的每一个词...

  • Lucene7.7.1和Solr7.7.1学习笔记(全)

    Lucene是一个全文检索引擎工具包,最初是apache软件基金会jakarta项目组的一个子项目,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的架构,提供了完整的查询引擎和索引引擎,以及部分文本分析引擎。...

  • 源代码-ajax即时聊天程序(新手学习推荐).zip

    源代码-ajax即时聊天程序(新手学习推荐).zip

  • python读取excel数据.doc

    以下是一个简单的Python代码,用于在控制台上打印一个看起来像爱心的形状。这个代码使用了ASCII字符来创建形状。 python print('\n'.join([''.join([('Love'[(x-y)%4] if ((x*0.05)**2+(y*0.1)**2-1)**3-(x*0.05)**2*(y*0.1)**3 <= 0 else ' ') for x in range(-30, 30)]) for y in range(15, -15, -1)])) 这个代码使用了数学公式来生成心形。但是,由于ASCII字符的限制,这个心形可能看起来不是很完美。 如果你想要一个更详细和定制化的心形,你可能需要使用图形库,如PIL(Python Imaging Library)或matplotlib。但是,这些库通常用于创建图像文件或在图形用户界面上绘制,而不是在控制台上打印。 另外,这里有一个使用turtle模块在图形窗口中绘制爱心的简单示例: python import turtle # 创建一个新的turtle对象 heart = turtle.Turtl

  • 【图像评价】图像去雾质量评价【含Matlab源码 066期】.zip

    Matlab领域上传的视频均有对应的完整代码,皆可运行,亲测可用,适合小白; 1、代码压缩包内容 主函数:main.m; 调用函数:其他m文件;无需运行 运行结果效果图; 2、代码运行版本 Matlab 2019b;若运行有误,根据提示修改;若不会,私信博主; 3、运行操作步骤 步骤一:将所有文件放到Matlab的当前文件夹中; 步骤二:双击打开main.m文件; 步骤三:点击运行,等程序运行完得到结果; 4、仿真咨询 如需其他服务,可私信博主或扫描视频QQ名片; 4.1 博客或资源的完整代码提供 4.2 期刊或参考文献复现 4.3 Matlab程序定制 4.4 科研合作

  • 30客户满意度调查表.DOC

    30客户满意度调查表.DOC

  • labelme, 一个用于图像标记的工具

    使用python3以上版本

  • cn-msdn-library-for-visual-studio-2008-service-pack-1-x86-dvd-x1

    cn_msdn_library_for_visual_studio_2008_service_pack_1_x86_dvd_x1.iso 分卷3

  • 变更申请单.xls

    变更申请单.xls

Global site tag (gtag.js) - Google Analytics