4

在我的工作中,我们有几个运行各种 RHEL 版本的 SGE 集群,我们正在使用更新的 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/XmsN,我可以使用N+1orso 作为h_vmem. 在新集群上,除非我设置h_vmem2N+1.

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

我尝试了多个版本的 JVM(1.6 和 1.7)。如果我省略h_vmem,它可以工作,但是运行起来风险更大。

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

4

1 回答 1

2

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

  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

什么会导致 java 进程大大超过 Xmx 或 Xss 限制?

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

于 2014-12-03T22:19:12.033 回答