代码之家  ›  专栏  ›  技术社区  ›  Aphoid

SGE h_vmem与java-Xmx-Xms

  •  4
  • Aphoid  · 技术社区  · 11 年前

    在我的工作中,我们有几个SGE集群运行各种版本的RHEL,我们正在用一个更新的Redhat测试一个新的集群。在旧集群(“Centos 5.4版”)上,我可以提交如下作业,并且运行良好:

    echo "java -Xms8G -Xmx8G -jar blah.jar ..." |qsub ... -l h_vmem=10G,virtual_free=10G ...

    在新集群“CentOS release 6.2(Final)”上,具有这些参数的作业由于内存不足而失败,我必须将h_vmem更改为h_vmem=17G才能成功。新节点的RAM大约是旧节点的3倍,在测试中,我一次只投入几项工作。

    在旧集群上,我会设置 -Xms/Xms 成为 N ,我可以使用 N+1 对于 h_vmem 。在新的集群上,除非我设置 h_vmem公司 成为 2N+1 .

    我写了一个很小的perl脚本,它所做的就是逐渐使用,消耗更多的内存,并定期打印出所使用的内存,直到崩溃或达到极限。h_vmem参数使其在预期的内存使用率下崩溃。

    我已经尝试过JVM的多个版本(1.6和1.7) h_vmem公司 ,它是有效的,但这样做的风险更大。

    我在谷歌上搜索过其他人看到类似问题的地方,但没有找到解决方案。

    1 回复  |  直到 11 年前
        1
  •  2
  •   Community CDub    7 年前

    这里的问题似乎是由以下因素组合而成的:

    1. 旧的集群是RHEL5,而新的RHEL6
    2. RHEL6包括对glibc的更新,它改变了MALLOC报告多线程程序内存使用情况的方式。
    3. JVM默认情况下包括一个多线程垃圾收集器

    为了解决这个问题,我使用了以下方法的组合:

    • 将MALLOC_ARENA_MAX环境变量导出为一个小数字(1-10),例如在作业脚本中。例如,包括以下内容: export MALLOC_ARENA_MAX=1
    • 将SGE内存请求适度增加10%左右
    • 通过使用显式地将java GC线程的数量设置为较低的数量 java -XX:ParallelGCThreads=1 ...
    • 增加了SGE线程请求。例如。 qsub -pe pthreads 2

    请注意,目前尚不清楚将MALLOC_ARENA_MAX一直设置为1是否是正确的数字,但从我的测试来看,低数字似乎很有效。

    以下是导致我得出这些结论的链接:

    https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

    What would cause a java process to greatly exceed the Xmx or Xss limit?

    http://siddhesh.in/journal/2012/10/24/malloc-per-thread-arenas-in-glibc/