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

tea*_*bot 9 debian jvm jvm-arguments large-object-heap huge-pages

我有一个Java服务,目前运行14GB堆.我很想试用-XX:+ UseLargePages选项来查看这可能会如何影响系统的性能.我已经使用适当的共享内存和页面值(这些也可以使用在线工具计算)按照Oracle的描述配置操作系统.

配置操作系统后,我可以看到它将预期的内存量分配为大页面.但是,使用-XX:+UseLargePages选项集启动VM 始终会导致以下错误之一:

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

    Failed to reserve shared memory (errno = 28). // 'No space left on device'
Run Code Online (Sandbox Code Playgroud)

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

    Failed to reserve shared memory (errno = 12). // 'Out of memory'
Run Code Online (Sandbox Code Playgroud)

我确实试过引入一些余地 - 所以在32GB系统上我分配了24GB的共享内存和大页面,用于配置20GB堆的JVM,其中目前只使用了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页面)之外,我还必须/etc/security/limits.confThomas的博客中添加条目.但是,当我的应用程序开始使用时,jsvc我还必须复制root用户的设置(请注意,限制以KB为单位指定):

    root       soft memlock 25165824
    root       hard memlock 25165824
    pellegrino soft memlock 25165824
    pellegrino hard memlock 25165824
Run Code Online (Sandbox Code Playgroud)

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

    java -XX:+UseLargePages -Xmx20g -version
Run Code Online (Sandbox Code Playgroud)

jfg*_*956 7

当您使用Java的大页面时,不仅有使用大页面的堆,而且还有PermGen:不要忘记为它分配空间.看来这就是为什么当你设置Xmx接近大页面数量时你有一个不同的错误消息.

还有一个shmall内核参数需要设置,你没有提到,也许是阻止你的东西.在您的情况下,您应将其设置为6291456.

最后要说的是:当使用大页面时,该Xms参数不再使用:Java Xmx使用大页面将所有内容保留在共享内存中.