gpt4 book ai didi

scala - 比一台机器上的多线程应用程序慢的 GridGain 应用程序

转载 作者:行者123 更新时间:2023-12-01 13:03:23 24 4
gpt4 key购买 nike

我已经实现了我的第一个 GridGain 应用程序,但没有获得预期的性能改进。可悲的是它更慢。我需要一些帮助来改进我的实现,以便更快。

我的应用程序的要点是我正在使用数百万个可能的参数进行强力优化,每个函数评估只需要几分之一秒。我通过将数百万次迭代分成几个组来实现这一点,每个组作为一个作业执行。

相关代码如下。函数 maxAppliedRange 为范围 x 中的每个值调用函数 foo,并返回最大值,结果成为每个作业找到的所有最大值中的最大值。

  scalar {
result = grid !*~
(for (x <- (1 to threads).map(i => ((i - 1) * iterations / threads, i * iterations / threads)))
yield () => maxAppliedRange(x, foo), (s: Seq[(Double, Long)]) => s.max)
}

我的代码可以选择在一台机器上执行多线程或使用上面的代码使用多个 GridGain 节点。当我运行 gridgain 版本时,它一开始似乎会更快,但随后总会发生一些事情:

  • 其中一个节点(在另一台机器上)错过了心跳,导致我的主计算机上的节点放弃该节点并开始第二次执行作业。
  • 错过心跳的节点继续做同样的工作。现在我有两个节点在做同样的事情。
  • 最终,所有作业都在我的主机上执行,但由于某些作业启动较晚,因此完成所有作业需要更长的时间。
  • 有时 GridGain 会抛出异常,因为节点超时,整个任务失败。
  • 我很生气。

我尝试将其设置为有多个作业,因此如果一个失败则没什么大不了的,但是当我这样做时,我最终会在每个节点上执行许多作业。这给每台机器带来了更大的负担,使节点更有可能错过心跳,导致一切都更快下坡。如果我每个 CPU 有一个作业,那么如果一个作业失败,则必须从头开始另一个节点。不管怎样我都赢不了。

我认为最好的办法是我可以做两件事:

  • 增加心跳的超时时间
  • 限制每个节点,使其一次只做一项工作。

如果我能做到这一点,我就可以将我的任务分成许多工作。每个节点一次只做一项工作,没有机器会因负担过重而错过心跳。如果作业失败,则几乎不会丢失任何工作,并且恢复会很快。

谁能告诉我怎么做?我应该在这里做什么?

最佳答案

我想通了。

首先,有一个 xml 配置文件,用于控制网格节点如何运行的细节。默认配置文件在 GRIDGAIN_HOME/config/default-spring.xml 中。当我启动网格节点时,我可以编辑它或复制它并将新文件传递给 ggstart.sh。我需要添加的两件事是:

    <property name="networkTimeout" value="25000"/>

将网络消息的超时设置为 25 秒,以及

   <property name="executorService">
<bean class="org.gridgain.grid.thread.GridThreadPoolExecutor">
<constructor-arg type="int" value="1"/>
<constructor-arg type="int" value="1"/>
<constructor-arg type="long">
<util:constant static-field="java.lang.Long.MAX_VALUE"/>
</constructor-arg>
<constructor-arg type="java.util.concurrent.BlockingQueue">
<bean class="java.util.concurrent.LinkedBlockingQueue"/>
</constructor-arg>
</bean>
</property>

前两个构造函数参数用于启动 1 个线程和最大线程大小 1。执行程序服务控制执行 gridgain 作业的线程池。默认值为 100,这就是我的应用程序不堪重负并且心跳超时的原因。

我必须对我的代码进行的另一个更改是:

  scalar.apply("/path/to/gridgain home/config/custom-spring.xml") {
result = grid !*~
(for (x <- (1 to threads).map(i => ((i - 1) * iterations / threads, i * iterations / threads)))
yield () => maxAppliedRange(x, kalmanBruteForceObj.performKalmanIteration), (s: Seq[(Double, Long)]) => s.max)
}

因为没有 .apply 语句,它会启动一个具有所有默认选项的网格节点,而不是具有上述编辑的配置文件,这正是我想要的。

现在它完全按照我的需要工作了。我可以将任务分成小块,即使是我最弱和最慢的计算机也可以为这项工作做出贡献。

关于scala - 比一台机器上的多线程应用程序慢的 GridGain 应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4481645/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com