【问题标题】:How to create minimal Akka actor?如何创建最小的 Akka 演员?
【发布时间】:2013-07-13 16:51:02
【问题描述】:

在我的笔记本上,100 万个 Akka 演员的实例化耗时约 20 秒:http://goo.gl/OwQht

我应该在configuration 还是code 中挖掘以加快它们的创建速度?

【问题讨论】:

  • 首先打开详细的 GC 日志,看看是否是问题所在。
  • 您想在不到 20 微秒的时间内创建一个 Actor 实例?
  • 另一个问题是你需要 100 万演员做什么?
  • 您的演员层次结构如何?这些都是同一个 ActorSystem 的顶级演员吗?这可能是性能瓶颈。尝试创建一个包含 1000 个顶级演员的层次结构,每个演员有 1000 个孩子。此外,给它们命名可能是个好主意,这样参与者系统就不必为它们生成唯一的名称。

标签: scala akka actor


【解决方案1】:

这里有一个小基准,展示了如何在层次结构中创建参与者。对于约 1000000 个演员,我也有大约 20 秒的时间,但这是在相当慢的笔记本 CPU 上,并且没有调整基准中的 useNUMA 等 JVM 选项。

我尝试从 github 运行您的基准测试,但它甚至无法在我的机器上启动,因为它需要的内存超过了我所拥有的 4GB。所以看来你的笔记本比我的强大多了。

这是我在两级层次结构(1000 个组,每组 1000 个工人)中创建演员时得到的结果

Created 1001001 actors
20.752500989 s
48235.198279503136 actors per second

以下是我在根 Actor 正下方创建 1000000 个 Actor 时得到的结果:

Created 1000001 actors
56.118988558 s
17819.29834616461 actors per second

很明显,即使在像我这样相对较慢的机器上,在层次结构中创建演员也有很大的性能优势。在具有更多内核的机器上,差异会更大。

编辑:我现在在我的主要开发机器上运行测试,这是一个具有 4 核的 i7,因此速度明显更快:

两级层次结构:

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()
    }
  }
}

【讨论】:

  • 创建顶级演员会降低性能,因此至少在层次结构中引入级别绝对是有意义的(这也是一种很好的做法)。
  • @endre-varga 是否在带有示例的文档中进行了解释?如果这是最佳实践,那为什么 Actor 系统默认不做呢?
  • 最佳实践是按层次结构组织你的演员,而不是平面结构。默认情况下,actor 系统无法做到这一点,因为“最佳”层次结构取决于应用程序(这是一个设计决策)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 1970-01-01
  • 2013-04-22
  • 2018-01-13
  • 2013-05-14
相关资源
最近更新 更多