Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在JSR352中,如何定义一个好的分区计划来确保CPU平衡?_Multithreading_Jakarta Ee_Jsr352 - Fatal编程技术网

Multithreading 在JSR352中,如何定义一个好的分区计划来确保CPU平衡?

Multithreading 在JSR352中,如何定义一个好的分区计划来确保CPU平衡?,multithreading,jakarta-ee,jsr352,Multithreading,Jakarta Ee,Jsr352,JSR352-Java平台的批处理应用程序使用分区提供并行特性。批处理运行时可以在不同的分区中执行一个步骤,以加快进度。JSR352还引入了threads定义:我们可以定义要使用的线程数,例如 <step id="Step1"> <chunk .../> <partition> <plan partitions="3" threads="2"/> </partition>

JSR352-Java平台的批处理应用程序使用分区提供并行特性。批处理运行时可以在不同的分区中执行一个步骤,以加快进度。JSR352还引入了
threads
定义:我们可以定义要使用的线程数,例如

<step id="Step1">
    <chunk .../>
        <partition>
            <plan partitions="3" threads="2"/>
        </partition>
    </chunk>
</step>

然后我感到困惑:如何给出一个受欢迎的分区计划,使每个线程都被占用,并确保CPU平衡

例如,有表A、B、C要做,它们的行分别是10亿、100万、1000。该步骤旨在将这些实体处理为文档,一个实体处理为一个文档。文档生成的顺序并不重要。这些表实体的CPU时间分别为1s、2s、5s。线程数是4

如果有3个分区,每个表类型一个分区,则该步骤需要
1*10^9
秒才能完成,因为:

  • 分区A将在线程2上运行
    1*10^9*1s=1*10^9s
  • 分区B将采用
    1*10^6*2s=2*10^6s
    ,在线程3上运行
  • 分区C将在线程4上运行
    1*10^3*5s=5*10^3s
但是,当线程2被占用时,线程3自
2*10^6s
起空闲,线程4自
5*10^3s
起空闲。显然,这不是一个好的分区计划

我的问题是:

  • 在上面的例子中有更好的分区计划要完成吗
  • 可以考虑:分区是一个消费队列,线程占用这个队列吗?
  • 通常,我可以/应该使用多少线程?这是相同数量的CPU内核吗
  • 一般来说,如何给出一个受欢迎的分区计划,使每个线程都被占用,并确保CPU平衡
    • 答案

      在上面的例子中有更好的分区计划要完成吗

      是的,有。见答案4

      可以考虑:分区是一个消费队列,线程占用这个队列吗?< /P> 事实就是这样

      通常,我可以/应该使用多少线程?这是相同数量的CPU内核吗

      视情况而定。这个问题有很多观点从JSR-352规范视图中,“线程”:

      指定要在其上执行分区的最大线程数 这一步的关键。注意:批处理运行时不能保证请求的线程数可用;它将尽可能多地使用,直到达到请求的最大值。这是一个可选属性。默认值是分区数

      因此,仅基于此透视图,您应该将此值设置为所需的最高值(批处理运行时将根据其资源设置实际限制!)

      从批处理运行时角度(JSR352实现):任何合适的实现都将使用线程池来执行分区步骤。所以,如果这样的池有一个固定的大小N,那么无论您设置了多大的线程数,您将永远不会并发执行超过N个分区

      JBeret是JSR352规范的一个实现,由wildfly服务器使用(我使用的就是这个实现)。在Wildfly,它的默认线程池设置为最多10个线程。该池不仅在分区步骤之间共享,还在批处理作业之间共享。因此,如果您同时运行两个作业,您将少使用两个线程。除此之外,当您进行分区时,一个线程扮演协调器的角色,将分区分配给其他线程并等待结果。。。因此,如果您的分区计划说它使用2个线程,那么实际上它将使用3个!(两名工人,一名协调员)。。。所有这些资源(线程)都来自同一个池

      无论如何,所有这些的重要一点是:调查您使用的JSR325的实现,并相应地进行设置

      从硬件视图看,您的CPU有一个线程最大限制。在此透视图下(根据经验法则),将“threads”值设置为该值

      从性能视图分析您正在做的工作。如果在多个线程之间访问共享资源(如DB),则可能会产生瓶颈,导致线程阻塞。如果你面临这样的问题,你必须考虑降低“theads”值

      总之将“线程”值设置为CPU最大线程限制。然后,检查该值是否不会导致阻塞问题;如果是,则减小该值。此外,请验证是否相应地配置了批处理运行时,并且它允许您执行所需数量的线程

      一般来说,如何给出一个受欢迎的分区计划,使每个线程都被占用,并确保CPU平衡

      避免使用静态分区计划(至少在您的情况下)。相反,使用分区映射器。分区映射器是一个类,它实现了
      javax.batch.api.Partition.PartitionMapper
      接口,并允许以编程方式定义分区计划(多少分区、多少线程、每个分区的属性)。因此,对于您的情况,将表(A、B、C)拆分为N个块(其中N=1000)。。。每个块将是一个分区。您应该从类型C的分区开始,在实体分区(表)之间进行循环:
      C0
      B0
      A0
      B1
      A1
      ,…,
      B999
      A999
      A1000
      A99999
      。。。使用此方案,实体C将首先完成,留下一个线程打开以解析更多的A和B分区。稍后,B将完成,留下更多资源来攻击剩余的A分区


      希望这对您有所帮助…

      通常在分区步骤中