当前位置: 首页 > 知识库问答 >
问题:

Akka-ActorRef。tell()需要几分钟来传递消息

燕智
2023-03-14

我有两个演员。每个参与者都位于不同的ActorSystem中。第一个缓存第二个ActorRef。第一个演员:

actorRef.tell(msg, self())

并向第二个参与者发送消息,第二个参与者使用

getSender().tell(reply, self())

问题:从第一个演员到第二个演员的最初讲述()有时需要1-3分钟(!)传递信息。

除了这个消息之外,没有其他消息在Akka中发送,这意味着邮箱是空的-系统正在为单个请求提供服务。

系统详情:

该应用程序有500个计划的参与者,他们每30秒(阻塞)轮询Amazon SQS并发出请求(SQS为空)。还有330名演员在我的剧本中什么都不做。所有参与者都配置了默认的Akka调度程序。

Box是Amazon EC2实例,具有2个内核和8gb RAM。CPU和RAM利用率为

最初的猜测是CPU饥饿和太多线程的上下文切换。但是在我的i7机器上无法本地复制,即使有x10个参与者,使用75%的可用RAM。

我如何才能真正找到这个问题的原因?有没有可能对Akka基础设施进行分析,看看是什么让这条信息在从一个参与者到另一个参与者的过程中花费了这么多时间?

共有1个答案

叶国兴
2023-03-14

来自太多线程的上下文切换可能是此问题的根源。为了修复它,添加了以下配置:

actor {
default-dispatcher {
executor = "fork-join-executor"
fork-join-executor
{ parallelism-min = 8 parallelism-factor = 12.0 parallelism-max = 64 task-peeking-mode = "FIFO" }
}
}

因此,我们将每个物理核的线程数从6个增加到24个。24就足以让我们的应用程序顺利运行。回归试验期间未观察到饥饿。

 类似资料:
  • 我有一个场景,其中我得到一个String消息列表,我必须遍历String并调用另一个方法,这是一个长时间运行的过程。然后我必须收集这个长时间运行过程的结果并连接结果并将其发送回用户交互界面。我对Scala中的这些未来概念很陌生。我正在使用Play框架,其中字符串列表将来自用户交互界面。这是我第一次尝试实现ht场景的样子: 为简单起见,long RunningCall将只返回一个字符串。稍后我将把它

  • 我有相当多的Apache Camel(路由/中介/Orchestation Engine;轻量级ESB)经验,正在绞尽脑汁地试图理解AKKA: 调度程序(,,) 路由器 池 组 事件总线 根据文件: 调度员是: 将路由创建为子参与者,并在路由终止时将其从路由器中删除的路由器的[一种类型]。 组包括: [一种类型的]执行元[其中路由]是在路由器外部创建的,路由器使用执行元选择将消息发送到指定路径,而

  • 我遇到了在多个请求下扩展应用程序的问题。 每个请求都向一个参与者发送一个ask,然后生成其他参与者。这是很好的,但是,在负载下(一次5个以上的询问),会花费大量的时间将消息传递给目标执行元。最初的设计是均匀地隔离请求,但这造成了一个瓶颈。示例: 在此图片中,是在查询计划解析程序之后发送的。但是,当执行元接收到此消息时有一个多秒的间隔。这只在负载(5+请求/秒)下才会出现。我最初以为这是一个饥饿的问

  • 我只需要小时,分钟和秒的倒计时,我在谷歌上搜索其他的js,但没有找到我要找的。 我不需要几天。

  • 我目前正在开发一个Android应用程序,我想包括Firebase云消息传递。我计划让树莓派每5分钟左右检查一个网站,并在发生变化时发送推送通知。在官方留档中,他们说我需要一个应用服务器才能通过Firebase发送消息。 这是否意味着我需要让我的Raspi全天候作为服务器运行,并且需要一个静态的IP/域?还是让我的Raspi通过Api(https://fcm.googleapis.com/fcm/

  • 我正在编写一个非常基本的油漆应用程序。 我的应用程序有一个图像,当我触摸任何地方时,这个地方会填充一种颜色。 我使用洪水填充算法(http://en.wikipedia.org/wiki/Flood_fill),特别是第二种替代实现方法。 我使用像素图来更新纹理。 这在我的电脑上运行得很好,问题是在我的android(分辨率为720p的摩托罗拉moto G,android 4.4)上执行应用程序时