我有一个当前使用 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