Java 动态地找到最佳的参与者数量

Java 动态地找到最佳的参与者数量,java,scala,akka,Java,Scala,Akka,我有一个主参与者,它通过将消息委托给其子代来处理消息,我希望找到最快处理这些消息的最佳子代数量。随着服务器上的负载因其他需要资源的应用程序而发生变化,子服务器的数量应随时间而变化。是否有一些路由器或模式已经很流行 编辑:我有非常具体的需求来做这件事,每个参与者都负责处理它启动的一个进程,这个进程完成了所有计算密集型的工作,所以参与者自己并没有做任何实际的工作,他们只是为了并发。这与其说是优化akka本身或jvm上的代码的问题,不如说是优化应用程序的多少个实例以获得最佳性能的问题。这完全取决于有多

我有一个主参与者,它通过将消息委托给其子代来处理消息,我希望找到最快处理这些消息的最佳子代数量。随着服务器上的负载因其他需要资源的应用程序而发生变化,子服务器的数量应随时间而变化。是否有一些路由器或模式已经很流行

编辑:我有非常具体的需求来做这件事,每个参与者都负责处理它启动的一个进程,这个进程完成了所有计算密集型的工作,所以参与者自己并没有做任何实际的工作,他们只是为了并发。这与其说是优化akka本身或jvm上的代码的问题,不如说是优化应用程序的多少个实例以获得最佳性能的问题。这完全取决于有多少工人。如果处理器的数量超过了可用的内核,那么我开始看到性能的大幅下降,当其他用户开始使用运行我的应用程序的服务器时,就会出现这种情况。通常我不会关心这种优化,但该应用程序正在运行大量模拟,这可能需要几天甚至几个月的时间。这个问题在我所从事的工程领域中非常重要,因为在这个领域中,模拟可能会花费很长时间。通常情况下,你不会像这样争夺资源,但这是我无法控制的情况

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

建议将服务器专用于我的应用程序-我无法做到这一点。 为了限制消息—进程本身在空闲时占用cpu,启动和终止它们也需要分配cpu,因为它们通过tcp连接到其他服务器
对于赏金,答案必须解决如何天真地控制某个庄园中的演员数量,以响应处理消息的时间。这些信息的工作量总是相同的,所以这不是一个可怕的策略,虽然不是最好的,但正如我所说的,如果对我来说,任何小的优化都是值得的,尽管我知道这通常不是一个好方法。

首先,正如您所了解的,强烈建议不要阻止参与者—您可以始终将阻止操作委托给将来在单独的ForkJoinPool中执行的参与者,但最好是使用异步API和complient解决方案。如果您的阻塞只是简单地说,那么使用scala.concurrent.blocking FJ Pool包装将自动适应负载,并使用CPU的最大值请参见下面如何控制此最大值;然而,创建一个补偿线程可能会花费你很多。因此,与使用FJs相比,反应性更好

所以,接下来要做的就是选择正确的池大小。通常,人们只是将其设置为等于处理器的数量,因此分配CPU时间的责任由JVM+OS承担。但是,JVM允许您测量要调整的系统业务,请参阅

所以你可以让工人的数量等于处理器的数量,但是当操作系统太忙时,你可以忽略其中的一些。这是一种非常正常的做法,因为目前活跃工人的数量永远不会超过处理器的数量

因此,利用这个想法,你可以在你的系统上产生某种背压。阿卡见和。背压和节流之间的关键区别在于背压会通知外部系统您正忙-您不必在缓冲区中存储消息,因此您也可以控制内存消耗


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

我认为对于邮箱为空的参与者,您不会支付太多的罚款,因此没有真正的需要减少参与者数量

如果您接受这一点,那么工作池的任何基本路由器都将为您工作,并根据您希望此参与者在给定时间处于活动状态的内核/线程数设置一些上限,即:

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

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

考虑使用
使用Akka actors实现的一组工作调度程序,具有自动缩放、背压、断路器和实时监视器。

Akka的内置调度程序允许设置要使用的最小和最大线程数。dispatcher的类型决定了应该使用哪种策略来增加或减少活动线程的数量。所以你应该只指定边界。你没有足够的信息来得到答案。真正的索尔
解决方案需要相当深入地了解应用程序、它们的时间表、它们的I/O量以及各种其他细节。如果进程可以在内核上不间断地运行,您将获得更好的性能,因为它们的数据将更多地保留在CPU缓存中-但您无法衡量内核何时可用,即使您可以,你可能反应不够快,无法充分利用它。我建议你看看Mesos/Marathon或Thread,甚至在docker容器中运行你的应用程序。你需要控制你的资源。@Rich Henry Thread看起来很酷,我没有时间重做我所做的事情,但是,也许将来如果我再做类似的事情,我会使用它。人们似乎不喜欢这个问题,但这是我的现实。假设linux不需要修改,你仍然可以在linux容器中运行应用程序。然后,您可以限制容器的资源使用,以阻止应用程序彼此运行。