无法使用-XX:+UseLargePages创建JVM

10

我有一个Java服务,当前使用14GB堆内存。我想尝试使用-XX:+UseLargePages选项,看看这对系统性能会有什么影响。我已经按照Oracle的说明配置了操作系统,使用适当的共享内存和页面值(也可以使用在线工具进行计算)。

一旦操作系统配置完毕,我可以看到它分配了预期数量的内存作为大页面。然而,设置-XX:+ UseLargePages选项启动VM始终会导致以下错误之一:

-Xms/-Xmx几乎等于大页面分配时:

    Failed to reserve shared memory (errno = 28). // 'No space left on device'

-Xms / -Xmx 小于大页面分配时:

    Failed to reserve shared memory (errno = 12). // 'Out of memory'

我尝试了一些宽限措施 - 在32GB的系统上,我分配了24GB的共享内存和hugepages给JVM配置的20GB堆,目前只使用了14GB。我还验证了执行JVM的用户确实具有与 /proc/sys/vm/hugetlb_shm_group 一致的组权限。

有人能指出我可能出了什么问题以及下一步该尝试什么吗?

分配/利用率:

  • -Xms / -Xmx - 20GB
  • 已使用的堆 - 14GB
  • /proc/sys/kernel/shmmax - 25769803776 (24GB)
  • /proc/sys/vm/nr_hugepages - 12288

环境:

  • 系统内存 - 32GB
  • 系统页大小 - 2048KB
  • debian 2.6.26-2-amd64
  • Sun JVM 1.6.0_20-b02

解决方案

感谢@jfgagne提供的答案,帮助我找到了一个解决方案。除了 /proc/sys/kernel/shmall 设置(指定为4KB页面)之外,我还必须像Thomas的博客中描述的那样在/etc/security/limits.conf中添加条目。然而,由于我的应用程序是使用 jsvc 启动的,所以我还必须为root用户复制设置(请注意,限制是以KB为单位指定的):

    root       soft memlock 25165824
    root       hard memlock 25165824
    pellegrino soft memlock 25165824
    pellegrino hard memlock 25165824

值得一提的是,可以通过使用-version参数启动JVM来快速测试设置:

    java -XX:+UseLargePages -Xmx20g -version

这个主题的文档很棒,网址是http://www.dataforte.net/blog/2010/03/12/java-and-large-memory-pages-on-linux/。您可以编辑/etc/pam.d/su和/etc/pam.d/sudo,确保它们包含以下行,而不是为root设置限制,以便应用上述内存限制:`session required pam_limits.so`。 - Dan Pritts
1个回答

9
当您在Java中使用巨页面时,不仅堆使用巨页面,而且PermGen也是如此:请不要忘记为其分配空间。这似乎是在将设置为大量巨页面时出现不同的errno消息的原因。
还有需要设置的内核参数,但您没有提及,可能是阻止您的原因。在您的情况下,您应该将其设置为6291456。
最后要说的是:在使用巨页面时,不再使用参数:Java使用巨页面在共享内存中保留所有。

谢谢,我会尝试一下。我假设shmall的单位是4K页? - teabot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接