我在 Red Hat Enterprise Linux Server 5.9 版上运行 java 服务器。最近我开始使用 HugePages,因为它有一些我想使用的优点。系统配置正确(与许多网站和博客状态一样),并且设置了 40G RAM 供大页使用。
HugePages_总计:20480
HugePages_Free:20480
HugePages_Rsvd:0
大页大小:2048 kB
服务器上的总内存:128G。设置hugePages后,机器重新启动,服务器进程在hugePages中启动,堆大小为29G。一切都很顺利。最近我对jvm参数做了一些更改,并将堆大小增加到30G。当jvm进程重新启动时,它没有使用大页。日志中显示错误:
Java HotSpot(TM) 服务器 VM 警告:无法保留共享内存 (errno = 22)
我做了一些测试,以确保 java 参数中的其他更改不会导致此问题,结论是增加堆大小是原因。
现在我不明白了。系统显示根本没有使用hugePages,因此还剩下40G空间,而java仍然无法保留其中的30G。
有人能解释为什么会发生这种情况吗?
更重要的是有什么方法可以确保将来不会发生这种情况吗?
这是生产系统,因此如果我创建最终配置,它将无法在巨大页面之外运行 java 进程,因为没有剩余空间。最终配置将是 96G 的巨大页面,其中一个 32GB 的 java 进程持续工作,并保留资源以在紧急情况下运行另外两个此类进程。我必须确保当这种紧急情况发生时,java进程将能够使用hugePages。
任何帮助都会很棒。
答案1
我相信您需要在 JVM 中显式启用大页使用-XX:+UseLargePages
,请查看这篇文章调整大型 Java 堆和 Linux 大页面。
您可能想查看其他相关的 JVM 开关。
答案2
另外,您应该检查 /etc/security/limits.conf 中的“memlock”参数。如果该参数未设置为足够高的值,则对于执行 JVM 的用户,该用户将无法分配大页,即使配置了足够的大页。 (如果您要分配的话,请确保 memlock 设置为至少 30GB。)