我有一个Java服务,当前以14GB的堆运行。我热衷于尝试使用-XX:+UseLargePages选项,以了解这可能如何影响系统性能。我已经使用适当的共享内存和页面值(也可以使用by Oracle来计算)按照an online tool所述配置操作系统。
配置完操作系统后,我可以看到它以大页面的形式分配了预期的内存量。但是,使用-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的共享内存和大页面,以与配置有20GB堆的JVM一起使用,目前仅使用14GB。我还验证了执行JVM的用户确实具有与/proc/sys/vm/hugetlb_shm_group
一致的组权限。谁能给我一些提示,指出我可能要去哪里以及接下来可以尝试什么?
分配/利用:
-Xms
/-Xmx
-20GB /proc/sys/kernel/shmmax
-25769803776(24GB)/proc/sys/vm/nr_hugepages
-12288 环境:
解决方案
感谢@jfgagne提供了导致解决方案的答案。除了
/proc/sys/kernel/shmall
设置(指定为4KB页面)之外,我还必须按照Thomas' blog所述将条目添加到/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
最佳答案
当您在Java中使用大页面时,不仅有使用大页面的堆,而且还有PermGen:请不要忘记为其分配空间。似乎这就是为什么在大页面数量附近设置Xmx
时会有不同的errno消息的原因。
还有一个shmall
内核参数需要设置,而您没有提到,这可能是阻止您的原因。在您的情况下,应将其设置为6291456。
最后要说的是:使用大页面时,不再使用Xms
参数:Java使用大页面将所有Xmx
保留在共享内存中。
关于jvm - 无法使用-XX :+UseLargePages enabled创建JVM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11230701/