9

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

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

-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 的共享内存和大页面来与配置有 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 页面)之外,我还必须按照Thomas 的博客/etc/security/limits.conf中的描述添加条目。但是,当我的应用程序开始使用时,我还必须复制 root 用户的设置(请注意,限制以 KB 为单位指定):jsvc

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

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

    java -XX:+UseLargePages -Xmx20g -version
4

1 回答 1

7

当你在 Java 中使用大页面时,不仅有使用大页面的堆,还有 PermGen:不要忘记为它分配空间。似乎这就是为什么当您设置Xmx接近大页面数量时您会收到不同的 errno 消息。

还有shmall一个你没有提到的需要设置的内核参数,也许是它阻碍了你。在您的情况下,您应该将其设置为 6291456。

最后要说的是:使用huge page时,Xms不再使用该参数:JavaXmx使用huge page将所有的保留在共享内存中。

于 2012-06-28T09:22:12.890 回答