2016-09-13 3 views
1

私は2人の俳優を抱えています。各アクタは異なるActorSystemにあります。最初のキャッシュActorRef秒。まず俳優が行われます。Akka - ActorRef.tell()はメッセージの配信に数分かかります

actorRef.tell(msg, self()) 

といくつかの処理を行う第二の俳優、にメッセージを送信し、

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

問題で応答:最初から二番目の俳優に初期TELL()時にはは1を取ります-3分(!)メッセージを配信します。

Akkaでは、メールボックスが空で、システムが1回のリクエストを処理していることを意味する、これ以外のメッセージはありません。

システムの詳細:

アプリケーション要求に投票アマゾンSQS(SQSが空である)500人の予定の俳優(ブロッキング)各30秒を持っています。私のシナリオでは何もしない330人の俳優がいます。すべてのアクタはデフォルトのAkkaディスパッチャで設定されています。

ボックスは、2つのコアと8GBのRAMを持つAmazon EC2インスタンスです。 CPUとRAMの使用率は、< 5%です。 JVMには約1000のスレッドがあります。

最初の推測は、CPUの枯渇と多すぎるスレッドからのコンテキスト切り替えです。しかし、私のi7マシンでは4コアのローカルには再現できません。使用可能なRAMの75%を使用するアクターの数がx10であってもです。

どうすればこの問題の原因を実際に見つけることができますか? Akkaインフラストラクチャをプロファイルして、1人の俳優から別の俳優へと過渡期を過ごすために、このメッセージに何が必要なのかを知ることは可能ですか?

+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からの物理コアあたりのスレッド数を増やします。回帰試験中に飢餓は観察されなかった。

関連する問題