私のノートブックでは、100 万の Akka アクターのインスタンス化に約 20 秒かかりました: http://goo.gl/OwQht
それらの作成を高速化するには、構成またはコードのどこを掘り下げる必要がありますか?
私のノートブックでは、100 万の Akka アクターのインスタンス化に約 20 秒かかりました: http://goo.gl/OwQht
それらの作成を高速化するには、構成またはコードのどこを掘り下げる必要がありますか?
これは、階層内でアクターを作成する方法を示す小さなベンチマークです。また、約 1000000 アクターで約 20 秒かかりますが、これはかなり遅いノートブック CPU であり、ベンチマークにある useNUMA などの JVM オプションの微調整はありません。
github からベンチマークを実行しようとしましたが、私のマシンでは起動しませんでした。これは、私が持っている 4 GB を超えるメモリが必要なためです。つまり、あなたのノートは私のものよりもはるかに強力なようです。
2 レベルの階層 (それぞれ 1000 ワーカーの 1000 グループ) でアクターを作成すると、次のようになります。
Created 1001001 actors
20.752500989 s
48235.198279503136 actors per second
ルート アクターの直下に 1000000 個のアクターを作成すると、次のようになります。
Created 1000001 actors
56.118988558 s
17819.29834616461 actors per second
したがって、私のような比較的遅いマシンでも、階層内にアクターを作成すると、パフォーマンスが大幅に向上することは明らかです。より多くのコアを搭載したマシンでは、差はさらに大きくなります。
編集:メインの開発マシンでテストを実行しました。これは、4コアのi7であるため、大幅に高速です。
2 レベルの階層:
Created 1001001 actors
2.358266323 s
424464.78170735424 actors per second
フラットな階層
Created 1000001 actors
6.032559898 s
165767.27241971265 actors per second
これを実行して、何が得られたかを報告してください。さまざまな階層の深さを試して、違いが生じるかどうかを確認できます。CPU とシステムの仕様を必ず追加してください。
case class CreateChildren(n:Int, inner:Option[CreateChildren] = None)
class TestActor extends Actor {
Main.newActorCreated()
def receive = {
case CreateChildren(n, inner) =>
val children = (0 until n).map(i => context.actorOf(Props[TestActor], "child_"+i))
for(msg<-inner; child<-children)
child ! msg
}
}
object Main extends App {
val count = new java.util.concurrent.atomic.AtomicInteger(0)
val system = ActorSystem.create("test")
val root = system.actorOf(Props[TestActor])
val t0 = System.nanoTime()
root ! CreateChildren(1000, Some(CreateChildren(1000)))
val total = 1001001
def newActorCreated() {
if(Main.count.incrementAndGet()==total) {
val dt = (System.nanoTime() - t0)/1e9
val per = total/dt
println(s"Created $total actors")
println(s"$dt s")
println(s"$per actors per second")
system.shutdown()
}
}
}