2016-09-13 54 views
1

我有兩個演員。每個演員都在不同的ActorSystem中。首先緩存ActorRef的第二個。第一演員的作用:Akka - ActorRef.tell()需要幾分鐘才能發送消息

actorRef.tell(msg, self()) 

併發送消息到所述第二行動者,其進行一些處理,並用

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

問題回覆:初始告訴()從第一到第二演員有時需要1 -3分鐘(!)傳遞訊息。

除此之外,沒有其他郵件在Akka發送,這意味着郵箱爲空 - 系統正在提供單個請求。

系統的細節:

應用具有500種調度行爲者投票亞馬遜SQS與請求(SQS是空的)每30秒(阻塞)。另有330名演員在我的場景中什麼都不做。所有演員都配置了默認的Akka調度器。

Box是具有2個內核和8GB內存的Amazon EC2實例。 CPU和RAM利用率爲5%。 JVM有大約1000個線程。

初步猜測是由於線程太多導致CPU不足和上下文切換。但是在我的i7機器上本地不能重複使用4個內核,甚至有x10個使用75%可用內存的演員。

我怎樣才能真正找到這個問題的原因?是否有可能對阿卡的基礎設施進行分析,看看這條消息是如何花費這麼多時間從一個演員到另一個演員的?

+0

我會使用類似'YourKit'的探查器或更簡單的方法進行線程轉儲,並瞭解您有多少個線程,以及是否所有線程都被阻塞。如果沒有可用的資源,您的演員將無法發送消息。另外,我不確定您的使用案例,但我會建議您不需要阻止線程的解決方案。 – hveiga

回答

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就足夠了我們的應用程序運行流暢。在迴歸測試中沒有觀察到飢餓。

相關問題