启用 ZGC 时获取 'allocation stall'
Getting 'allocation stall' when enabling ZGC
我正在测试新的 zgc
垃圾收集器,它包含在 java
11 中,因为它承诺非常低的延迟。我们的应用程序是一种实时服务,每秒创建和销毁许多对象,它在使用 akka
.
的多线程环境中执行。
通过传递选项 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
并启用 gc
日志来启用 zgc
时,我们可以在日志中看到许多类似于此的消息:
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-6) 11332.231ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-26) 9898.046ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-52) 12133.240ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-54) 9002.299ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-50) 12134.218ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-46) 12132.540ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-56) 8072.664ms
几秒钟后 JVM 退出,没有给出任何原因。我们 运行 openjdk-java-11
。
关于如何使这项工作有任何建议吗?
分配停止意味着线程正在请求堆并且 none 可用,因此请求线程正在阻塞。
确保您有足够的 gc 线程设置。 JDK 检测核心计数时可能会遇到问题,尤其是在使用 Docker 时,gc 线程的默认值来源于此。参见 https://wiki.openjdk.java.net/display/zgc/Main#Main-SettingConcurrentGCThreads
如果您的 CPU util 在这些时间里很低,则表明您需要更多 GC 线程。
一般来说,启用 hugepages
可以提高 ZGC 的性能。 https://wiki.openjdk.java.net/display/zgc/Main#Main-EnablingLargePagesOnLinux
此外,您可能只需要更多堆。
编辑添加:可能还值得确保您使用的是 jdk 和 OS.[=13 的最新补丁版本=]
我正在测试新的 zgc
垃圾收集器,它包含在 java
11 中,因为它承诺非常低的延迟。我们的应用程序是一种实时服务,每秒创建和销毁许多对象,它在使用 akka
.
通过传递选项 -XX:+UnlockExperimentalVMOptions -XX:+UseZGC
并启用 gc
日志来启用 zgc
时,我们可以在日志中看到许多类似于此的消息:
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-6) 11332.231ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.remote.default-remote-dispatcher-26) 9898.046ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-52) 12133.240ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-54) 9002.299ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-io-blocking-dispatcher-50) 12134.218ms
[2020-05-20T18:05:36.563+0000][63.850s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-46) 12132.540ms
[2020-05-20T18:05:36.563+0000][63.851s][info ][gc] Allocation Stall (Main-akka.actor.default-dispatcher-56) 8072.664ms
几秒钟后 JVM 退出,没有给出任何原因。我们 运行 openjdk-java-11
。
关于如何使这项工作有任何建议吗?
分配停止意味着线程正在请求堆并且 none 可用,因此请求线程正在阻塞。
确保您有足够的 gc 线程设置。 JDK 检测核心计数时可能会遇到问题,尤其是在使用 Docker 时,gc 线程的默认值来源于此。参见 https://wiki.openjdk.java.net/display/zgc/Main#Main-SettingConcurrentGCThreads
如果您的 CPU util 在这些时间里很低,则表明您需要更多 GC 线程。
一般来说,启用 hugepages
可以提高 ZGC 的性能。 https://wiki.openjdk.java.net/display/zgc/Main#Main-EnablingLargePagesOnLinux
此外,您可能只需要更多堆。
编辑添加:可能还值得确保您使用的是 jdk 和 OS.[=13 的最新补丁版本=]