动态查找最佳演员数

时间:2015-09-14 13:51:17

标签: java scala akka

我有一个主演员通过委托他们的孩子来处理消息,我想找到最快处理这些消息的孩子的最佳数量。随着服务器上的负载从需要资源的其他应用程序发生变化,子项数应随时间变化。是否有一些已经流行的路由器或模式?

编辑:我有非常具体的需要这样做,每个演员负责照顾它开始的一个进程,它完成所有计算密集型工作,所以演员本身没有做任何真实的工作,他们只是为了并发。这不是一个问题,而是优化akka本身或jvm上的代码,而是并行运行多少个应用程序实例以获得最佳性能。这完全取决于有多少工人。如果有多个处理器而不是可用内核,那么我开始看到性能大幅下降,当其他用户开始使用运行我的应用程序的服务器时就会发生这种情况。通常我不关心这种优化,但应用程序正在运行大量的模拟,这可能需要数天,可能需要数月。这个问题在我工作的领域(工程)非常重要,模拟可能需要永远。通常你不会竞争这样的资源,但这是我无法控制的情况。

请理解以下所有内容对我都没有用。

  • 建议仅将服务器专用于我的应用程序 - 我无法执行此操作。
  • 要限制消息 - 进程本身在空闲时占用CPU,启动和终止它们也需要分配cpu,因为它们通过tcp连接到其他服务器

对于赏金的答案必须解决如何天真地控制某些庄园中的演员数量,这些演员响应处理消息的时间。消息总是相同的工作量,所以这不是一个可怕的策略,虽然不是最好的,但就像我说的,任何小的优化是值得的,如果我的情况,虽然我理解一般这不是一个伟大的方法。 / p>

3 个答案:

答案 0 :(得分:1)

首先,强烈建议不要阻止一个actor(正如你可以在Akka docs中读到的那样) - 你总是可以将阻塞操作委托给在Future内执行的ForkJoinPool,但最好是当然,要使用异步API(和reactive - 兼容解决方案)。如果你的阻塞是managed(只是说,用scala.concurrent.blocking包裹)FJ-Pool会自动适应负载,并使用最大的CPU(参见下面如何控制这个最大值);但是,创建补偿线程可能会花费很多。所以,最好是"反应"而不是使用FJ。

那之后剩下的就是选择正确的游泳池大小。通常,人们只是将其设置为等于处理器数量,因此分配CPU时间的责任归于JVM + OS。但是,JVM允许您测量要调整的系统业务,请参阅OperatingSystemMXBeanThreadMXBean

因此,您可以将工作人员数量等于处理器数量,但是当操作系统太忙时,您可以忽略其中一些。这是一种非常正常的做法,因为活跃的工人(目前)数量超过处理器的数量从来都不是好事。

因此,使用这个想法可以在您的系统上产生某种背压。有关Akka的信息,请参阅Akka and BackPressureThrottling。背压和节流之间的关键区别在于背压正在通知外部系统您正忙着 - 您不必在缓冲区内存储消息,因此您也可以控制内存消耗。

根据当前的统计数据 - Queuing Theory谈论如何准确选择(精确地说,从最大值动态减少它们)值可能有所帮助。

答案 1 :(得分:1)

我不认为你为一个空邮箱的Actor支付大部分罚款,所以没有必要缩小玩家数量。

如果你接受这个,那么工作池的任何基本路由器都可以为你工作,其中一些上限取决于你希望这个actor在给定时间内有效的核心/线程数,即:

http://doc.akka.io/docs/akka/snapshot/scala/routing.html#SmallestMailboxPool

另一种方法可能是创建一个actor来处理在处理输入后将终止的每个传入任务。为此,您只需在传入消息的处理程序中创建actor,并在完成其工作并提供结果后让该actor停止。

除了这些策略之外的任何优化都应该在您尝试过这些策略并且发现它们不足之后才进行 - 不要过早优化。

答案 2 :(得分:1)

考虑使用https://github.com/iheartradio/kanaloa 使用具有自动缩放,背压,断路器和实时监视器的Akka演员实施的一组工作调度员。