我有一个目前以14GB堆运行的Java服务。我很想尝试-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
答案 0 :(得分:7)
当你使用Java的大页面时,不仅有使用大页面的堆,而且还有PermGen:不要忘记为它分配空间。这似乎是为什么当你将Xmx
设置在接近大页面数量时,你会有一个不同的错误消息。
还有一个shmall
内核参数需要设置,你没有提到,也许它阻止了你。在您的情况下,您应将其设置为6291456。
最后要说的是:当使用大页面时,Xms
参数不再使用:Java使用大页面保留共享内存中的所有Xmx
。