【问题标题】:GridGain distribute Tasks according to CPU Numbers of Nodes available in ProjectionGridGain 根据 Projection 中可用节点的 CPU 数量分配任务
【发布时间】:2015-01-16 12:29:31
【问题描述】:

我编写了一个非常简单的 Java 应用程序,它执行一些 md5 哈希计算。 我正在尝试将此计算分配到我实验室内的多个节点以加快速度。 这实际上确实有效,但它的分布方式给我带来了麻烦。 网格中的节点有 8 个 cpu,而节点只有一个。 我想为每个节点的每个 CPU 分配一个作业(线程、可调用、任务)。但是我得到了一个非常糟糕的分布:有时 4 个作业在一个具有一个 cpu 的节点上运行,而一个具有 8 个 cpu 的节点只获得 2 或 3 个任务。 我在 GridGain API(forPredicate in GridGain API) 中找到了 forPredicate(GridPredicate p) 函数:

创建一个网格投影,其中包括通过给定谓词过滤器的所有节点。

但是,我用错了,或者我弄错了它的功能。这是我得到的一个最小示例:

       public class Driver implements GridCallable<Integer>{
        [...]                    
        Grid g = GridGain.start(gConf);    
        ArrayList<GridFuture<Integer>> workers = new ArrayList<GridFuture<Integer>>();
        for(int i=0; i<workercount; i++){
            Driver worker = new Driver();
            //Here some values get added to the driver object, irrelevant
            workers.add(g.forPredicate(new GridPredicate<GridNode>() {
                    @Override
                    public boolean apply(GridNode node) {
                        int cores = node.metrics().getTotalCpus();
                        return ((node.metrics().getCurrentWaitingJobs()+node.metrics().getCurrentActiveJobs()) < cores);
                    }
            }).compute().call(worker));
        }
        [...]
        public Integer call(){[...]}
        }

预期的行为是它检查每个节点它有多少 cpu,并在向它发送作业之前检查作业计数(活动和等待)是否大于此数字。 但是,事实并非如此。我仍然得到一个“糟糕的分布”。 谁能告诉我如何根据每个节点的可用 CPU 数量进行分配? 感谢您的帮助和时间!

【问题讨论】:

    标签: java distributed-computing gridgain


    【解决方案1】:

    将指标用于运行时间相对较短的任务通常效果不佳,因为指标更新频率太小。

    我看到了两种开箱即用的解决方案:

    • GridWeightedRandomLoadBalancingSpi 配置为节点权重等于可用处理器的数量,并在网格上执行您的任务而不选择子投影,让 GridGain 对任务进行负载平衡。然后节点将获得与可用处理器数量成比例的负载。
    • 配置GridJobStealingCollisionSpi。在这种情况下,负载不足的节点将从过载节点“窃取”作业,而作业在队列中等待。当事先不知道作业计算成本时,这种方法尤其适用。

    有关更多信息,请参阅 SPIs javadoc 和文档: http://doc.gridgain.org/latest/Job+Collision+Resolution http://doc.gridgain.org/latest/Load+Balancing

    UPD:以下是配置加权负载平衡 SPI 以使用可用处理器数量的方法:

    <property name="loadBalancingSpi">
        <bean class="org.gridgain.grid.spi.loadbalancing.weightedrandom.GridWeightedRandomLoadBalancingSpi">
            <property name="useWeights" value="true"/>
            <property name="nodeWeight" value="#{T(java.lang.Runtime).getRuntime().availableProcessors()}"/>
        </bean>
    </property>
    

    【讨论】:

      猜你喜欢
      • 2020-12-13
      • 2015-05-06
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多