Akka - ActorRef.tell()需要几分钟才能传递消息

时间:2016-09-13 13:04:00

标签: java concurrency akka

我有两个演员。每个演员都在不同的ActorSystem中。首先缓存一秒钟的ActorRef。第一个演员做:

actorRef.tell(msg, self())

并向第二个actor发送一条消息,该消息进行一些处理并用

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

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

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

系统详情:

应用程序有500个预定的参与者,每30秒(阻塞)用一个请求(SQS为空)轮询Amazon SQS。它有另外330个演员在我的场景中什么都不做。所有参与者都配置了默认的Akka调度程序。

Box是具有2个内核和8GB RAM的Amazon EC2实例。 CPU和RAM利用率<5%。 JVM有大约1000个线程。

最初的猜测是来自太多线程的CPU饥饿和上下文切换。但是我的i7机器本地不可再现,有4个核心,甚至有x10个演员使用75%的可用内存。

我怎样才能真正找到这个问题的原因?是否有可能对Akka基础设施进行分析,看看这条消息是如何花费这么多时间从一个演员转移到另一个演员的呢?

1 个答案:

答案 0 :(得分:0)

从太多线程切换上下文可能是此问题的根源。为了解决这个问题,我添加了以下配置:

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足以使我们的应用程序顺利运行。在回归测试中没有观察到饥饿。