I have a Java service that currently runs with a 14GB heap. I am keen to try out the -XX:+UseLargePages option to see how this might affect the performance of the system. I have configured the OS as described by Oracle using appropriate shared memory and page values (these can also be calculated with an online tool).
Once the OS is configured, I can see that it allocates the expected amount of memory as huge-pages. However, starting the VM with the -XX:+UseLargePages
option set always results in one of the following errors:
When -Xms
/ -Xmx
is almost equal to the huge page allocation:
Failed to reserve shared memory (errno = 28). // 'No space left on device'
When -Xms
/ -Xmx
is less than the huge page allocation:
Failed to reserve shared memory (errno = 12). // 'Out of memory'
I did try introducing some leeway - so on a 32GB system I allocated 24GB of shared memory and hugepages to use with a JVM configured with a 20GB heap, of which only 14GB is currently utilized. I also verified that the user executing the JVM did have group rights consistent with /proc/sys/vm/hugetlb_shm_group
.
Can anyone give me some pointers on where I might be going wrong and what I could try next?
Allocations/utilization:
-Xms
/-Xmx
- 20GB- Utilized heap - 14GB
/proc/sys/kernel/shmmax
- 25769803776 (24GB)/proc/sys/vm/nr_hugepages
- 12288
Environment:
- System memory - 32GB
- System page size - 2048KB
- debian 2.6.26-2-amd64
- Sun JVM 1.6.0_20-b02
Solution
Thanks to @jfgagne for providing an answer that lead to a solution. In addition to the /proc/sys/kernel/shmall
setting (specified as 4KB pages), I had to add entries to /etc/security/limits.conf
as described on Thomas' blog. However, as my application is started using jsvc
I also had to duplicate the settings for the root user (note that the limits are specified in KB):
root soft memlock 25165824
root hard memlock 25165824
pellegrino soft memlock 25165824
pellegrino hard memlock 25165824
It's also worth mentioning that settings could be tested quickly by starting the JVM with the -version
argument:
java -XX:+UseLargePages -Xmx20g -version
session required pam_limits.so
– Phenacetin