有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

爪哇阿克卡阿克塔里夫。tell()需要几分钟来传递消息

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

actorRef.tell(msg, self())

并向第二个参与者发送消息,第二个参与者执行一些处理并使用

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

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

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

系统详细信息:

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

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

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

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


共 (1) 个答案

  1. # 1 楼答案

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

    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就足够让我们的应用程序顺利运行了。回归试验期间未观察到饥饿