为什么在 Java 9 G1 工作约 6 个小时而没有实际增加负载的情况下,性能会下降?

我将 1 个实例(2 个 vCPU、2GB RAM、加载约 4k req/秒)切换到 Java 9(从最新的 Java 8 开始)。有一段时间,一切都很好,CPU使用率和以前一样。但是,在大约6小时后,CPU消耗无缘无故地增加了4%(从21%增加到25%)。我没有流量峰值,没有增加内存消耗,没有指标更改(我为代码中的每个方法都有计数器)。无。

我将此实例保持未动状态约12个小时,期望它会恢复。但一切都没有改变。它只是开始消耗更多的CPU。

top命令显示实例的 CPU 峰值比 Java 服务器进程通常的 CPU 峰值更多。我最近读到G1不适合高吞吐量。所以我得出了一个结论,即理性可能在G1中。

我重新启动了实例:

java -XX:+UseParallelGC -jar server-0.28.0.jar

经过约20个小时的监控,一切都像以前一样好。CPU 消耗与许多天前一样处于 21% 的水平。

部署 Java 9 后的 CPU 使用率(6 小时规模):

enter image description here

7 小时 + 12 小时“未触及”(7d 比例)后 CPU 增加:

enter image description here

之后的 CPU - (24 小时刻度):XX:+UseParallelGC

enter image description here

所以我的问题是 - 这是G1的预期行为吗?还有其他人看到类似的东西吗?

乌班图 16.04 x64

java version "9"
Java(TM) SE Runtime Environment (build 9+181)
Java HotSpot(TM) 64-Bit Server VM (build 9+181, mixed mode)

编辑 03.01.2019

尝试在java 10.0.2上运行一个与G1相同的服务器:

java version "10.0.2" 2018-07-17
Java(TM) SE Runtime Environment 18.3 (build 10.0.2+13)
Java HotSpot(TM) 64-Bit Server VM 18.3 (build 10.0.2+13, mixed mode)

G1 比服务器重新启动后消耗的 CPU 多 40%。UseParallelGC


答案 1

(请注意,GC调优非常依赖于环境,因此没有神奇的配方。

与G1有一个非常相似的问题。默认情况下,它似乎不太适合REST端点(同样,这只是我在直接邻居中经历的)。对我有帮助的是试验GC标志,如此处所述

对我们来说,最大的改进来自 -XX:G1NewSizePercent=25 和 -XX:MaxGCPauseMillis=50。G1 也会随时间推移自动调整自身,因此最大 GC 暂停限制对所有其他参数都有显著影响。


答案 2

推荐