【问题标题】:Executing millions of tasks in Java within a short period of time?在短时间内用 Java 执行数百万个任务?
【发布时间】:2014-08-26 03:31:40
【问题描述】:

我需要用 Java 执行大约 8,000,000 个任务。每个任务的运行时间在 1 到 50 毫秒之间。我尝试使用循环串行执行这些任务,并使用ThreadPoolExecutor 并行执行这些任务。显然,在循环中连续运行它们要慢得多,然后通过ThreadPoolExecutor 运行它们会显着提高性能。但是,我仍然对ThreadPoolExecutor 的性能不满意。

我能够在 4 个内核上使用 15 个线程运行所有 8,000,000 个任务。在向ThreadPoolExecutor 提交任务时,我正在批处理 50,000 个任务。我允许 ExecutorCompletionService 返回结果的 1000 毫秒超时。在使用这些参数调整我的应用程序后,我将有大约 25 分钟的时间来处理所有 8,000,000 个任务。

有什么方法可以让我的应用程序运行速度超过 25 分钟,也许是 Hadoop(使用多台机器的分布式系统)?我愿意使用其他一些技术或框架。

【问题讨论】:

  • Hadoop 或 Cassandra 可能会有所帮助,这取决于您是否遇到 Amdahl's law。您的任务可以提高效率吗?
  • 你只需将应用程序复制到10台机器上,将800万个任务分成10个部分,在10台机器上点击“运行”10次
  • 增加线程数会有所帮助,但这也需要更多内核数才能看到性能提升。
  • 您确定您的程序受 CPU 限制吗?
  • 您是否正在丢弃您创建的对象?有什么可以重复使用的吗?

标签: java multithreading performance


【解决方案1】:

这个Akka tutorial 展示了 Akka 如何帮助处理并行任务。

我没有任何使用 Akka 的实践经验,但我的理解是它会根据部署时的配置(例如,线程数、进程数、集群中的主机......)来处理应用程序的扩展,任务实现几乎没有变化。

更多关于维基百科的信息:The key points distinguishing applications based on Akka actors

【讨论】:

    【解决方案2】:

    为了找到最佳线程数,您必须查看单个任务。

    如果任务只使用内核,则没有其他任务可以在同一内核上执行。但是,大多数任务都有一些 IO 元素,例如读取数据进行处理和写回结果(假设您的任务是例如一些复杂的计算)。

    线程数应约为 'amount of cores' x 'utilization percentage' 其中利用率百分比是您在零和一之间的调整参数。使用动态查找核心数:

    int cores = Runtime.getRuntime().availableProcessors();
    

    所以

    int poolcount = Math.round( cores * utilizationFactor);
    

    如果您随后需要缩放,您可以水平或垂直缩放。

    横向上,更多的内核会调整吞吐量,但如果任务之间的同步过多,则在这种情况下利用率可能不是线性的。

    垂直地,更多的计算机,肯定会给你更多的核心来计算。因此,由于横向扩展的成本,处理农场一直很有趣。但是,分发成本和分发数据以进行计算的成本一直是瓶颈。

    正如所评论的,Hadoop 通过将数据分布在分区中并将计算发送到数据来解决问题。这非常适合通过简单合并进行的分而治之类型的任务。

    Cassandra,也评论说,提供了一个分布式数据库,其中分区写入通过提交日志和选择性读/写一致性处理。这基本上可以更快地移动您的数据,但我怀疑您并不太依赖于此。

    除了这些说明之外,您还真的需要深入了解您的任务,了解它们是如何构思的以及它们应该实现的目标,尤其是在分而治之的性质或顺序/管道性质方面。正如还建议的那样,Akka 在处理异步任务方面提供了很多帮助,并且有助于解决同步障碍。

    最后,我的最后一条建议是查看 LMAX Disruptor (http://lmax-exchange.github.io/disruptor/)。这应该允许您以非常高的吞吐量在阶段之间传递工作负载。这(连同最佳核心控制)可能会提高您的速度,而无需过多地重新考虑场景。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-21
      • 2022-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多