我有一个Java服务,当前使用14GB堆内存。我想尝试使用-XX:+UseLargePages选项,看看这对系统性能会有什么影响。我已经按照Oracle的说明配置了操作系统,使用适当的共享内存和页面值(也可以使用在线工具进行计算)。
一旦操作系统配置完毕,我可以看到它分配了预期数量的内存作为大页面。然而,设置-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的共享内存和hugepages给JVM配置的20GB堆,目前只使用了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
中添加条目。然而,由于我的应用程序是使用 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