我的工作中有几个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
,它会起作用,但是运行起来风险更大。
我已经搜索过其他人看到类似问题的地方,但没有找到任何解决方案。
答案 0 :(得分:2)
这里的问题似乎是以下因素的组合问题:
为了解决这个问题,我使用了以下各项的组合:
export MALLOC_ARENA_MAX=1
java -XX:ParallelGCThreads=1 ...
qsub -pe pthreads 2
请注意,目前还不清楚将MALLOC_ARENA_MAX一直设置为1是正确的数字,但是低数字似乎在我的测试中运行良好。
以下是引导我得出这些结论的链接:
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/