2

私のノートブックでは、100 万の Akka アクターのインスタンス化に約 20 秒かかりました: http://goo.gl/OwQht

それらの作成を高速化するには、構成またはコードのどこを掘り下げる必要がありますか?

4

1 に答える 1

5

これは、階層内でアクターを作成する方法を示す小さなベンチマークです。また、約 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()
    }
  }
}
于 2013-07-14T09:26:34.487 に答える