SGE h_vmem vs java -Xmx -Xms

时间:2013-09-09 22:30:46

标签: java memory cluster-computing sungridengine

我的工作中有几个SGE集群运行各种版本的RHEL,我们正在使用更新的Redhat测试一个新版本。在旧的集群(“Centos版本5.4”)上,我能够提交类似下面的工作,它运行良好:

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

在新群集“CentOS版本6.2(最终版)”中,具有这些参数的作业由于内存不足而失败,我必须将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 个答案:

答案 0 :(得分:2)

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

  1. 旧群集是RHEL5,新RHEL6
  2. RHEL6包含对glibc的更新,它更改了MALLOC报告多线程程序的内存使用情况的方式。
  3. JVM默认包含多线程垃圾收集器
  4. 为了解决这个问题,我使用了以下各项的组合:

    • 将MALLOC_ARENA_MAX环境变量导出为较小的数字(1-10),例如在工作脚本中。即包含类似:export MALLOC_ARENA_MAX=1
    • 的内容
    • 将SGE内存请求中等增加10%左右
    • 使用java -XX:ParallelGCThreads=1 ...
    • 将java GC线程的数量显式设置为较小的数字
    • 增加了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/