【问题标题】:How to prevent physical memory consuming when running parallel Java processes运行并行 Java 进程时如何防止物理内存消耗
【发布时间】:2017-03-20 11:49:31
【问题描述】:

我有一些功能的大列表(最多 500 000 个)。 我的任务是为每个函数生成一些图表(它可以独立于其他函数)并将输出转储到文件(可以是多个文件)。 生成图表的过程可能很耗时。

我还有 40 个物理内核和 128GB 内存的服务器。

我曾尝试使用 java Threads/ExecutorPool 实现并行处理,但似乎并未使用处理器的所有资源。 在某些输入上,该程序需要长达 25 小时才能运行,并且根据 htop 只有 10-15 个内核在工作。

所以我尝试的第二件事是创建 40 个不同的进程(使用 Runtime.exec)并在它们之间拆分列表。 此方法使用处理器的所有资源(所有 40 个内核上的 100% 负载),并且在前面的示例中将性能提高了 5 倍(只需要 5 小时,这对我的任务来说是合理的)。 但是这种方法的问题是,每个java进程都是独立运行的,独立消耗内存。在某些情况下,并行工作 5 分钟后会消耗所有 128gb 的内存。我现在使用的一种解决方案是,如果 Runtime.totalMemory > 2GB,则为每个进程调用 System.gc()。这会稍微降低整体性能(先前输入为 8 小时),但会使内存使用量保持在合理的范围内。 但此配置仅适用于我的服务器。如果在 40 核 64GB 运行的服务器上运行,则需要调优 Runtime.totalMemory > 2GB 条件。

那么问题是避免这种激进的内存消耗的最佳方法是什么?

运行单独的进程来执行并行作业是正常的做法吗?

Java 中是否有其他并行方法(可能是 fork/join?)使用 100% 的处理器物理资源。

【问题讨论】:

  • 你的Executor中有多少线程?
  • Fork/join 在内部使用执行器池。
  • 有什么理由不能让 Java 使用所有 128GB 的​​ RAM?如果没有其他需要它,它就会浪费。自己调用 System.gc() 也不是一个解决方案,因为 Java 非常有能力管理自己的内存。
  • 另外,如果你的进程是多线程的,你可能不应该运行其中的 40 个。
  • @kgeorgiy 我试过 Runtime.getRuntime().availableProcessors() + 1 和 Runtime.getRuntime().availableProcessors() *2 没有真正的区别

标签: java multithreading parallel-processing


【解决方案1】:

您无需显式调用System.gc()! JVM 会在需要时自动完成,而且几乎总是做得更好。但是,您应该将最大堆大小 (-Xmx) 设置为可以正常工作的数字。

如果您的程序无法进一步扩展,您就会遇到某种拥塞。您可以分析您的程序以及您的 java 和系统设置并找出原因,或者将其作为多个进程运行。如果每个进程都是多线程的,那么使用 5-10 个进程而不是 40 个进程可能会获得更好的性能。

请注意,您可能在每个内核多个线程的情况下获得更高的性能。摆弄每个内核 1-8 个线程,看看吞吐量是否会增加。

根据您的描述,听起来您有 500,000 个完全独立的工作项,并且每个工作项实际上并不需要很多内存。如果这是真的,那么内存消耗就不是真正的问题。只要每个进程都有足够的内存,所以它不必经常 gc,那么 gc 就不会对总执行时间产生太大影响。只需确保您不再需要任何悬空引用即可。

【讨论】:

    【解决方案2】:

    这里的问题之一是:仍然很难理解有多少线程、内核……实际上是可用的。

    我的个人建议:Java 专家时事通讯上有几篇文章对这个主题进行了非常深入的探讨。

    比如这个:http://www.javaspecialists.eu/archive/Issue135.html

    或更新的“可用处理器数量”:http://www.javaspecialists.eu/archive/Issue220.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-09
      • 2018-12-08
      • 1970-01-01
      • 2019-03-07
      • 1970-01-01
      • 2021-10-13
      • 1970-01-01
      • 2019-02-21
      相关资源
      最近更新 更多