Cannot create JVM with -XX:+UseLargePages enabled

我只是一个虾纸丫 提交于 2019-12-05 18:24:17

问题


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

回答1:


When you use huge pages with Java, there is not only the heap using huge pages, but there is also the PermGen: do not forget to allocate space for it. It seems this is why you have a different errno message when you set Xmx near the amount of huge pages.

There is also the shmall kernel parameter that needs to be set which you did not mention, maybe it is what is blocking you. In your case, you should set it to 6291456.

The last thing to say: when using huge pages, the Xms parameter is not used anymore: Java reserves all Xmx in shared memory using huge pages.



来源:https://stackoverflow.com/questions/11230701/cannot-create-jvm-with-xxuselargepages-enabled

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!