我将 1 个实例(2 个 vCPU,2GB RAM,负载 ~4k req/sec)切换到 Java 9(来自最新的 Java 8)。有一段时间,一切都很好,CPU使用率和以前一样。但是,大约 6 小时后,CPU 消耗无缘无故地增加了 4%(从 21% 到 25%)。我没有流量高峰, 没有内存消耗增加,没有指标变化(我在代码中的每个方法都有计数器)。什么都没有。
我让这个实例保持原样大约 12 小时,希望它会恢复原状。但什么都没有改变。它刚刚开始消耗更多的 CPU。
top
命令显示该实例的 CPU 峰值比 Java 服务器进程的通常情况要多。我最近读到 G1 不适合高吞吐量。所以我得出一个结论,原因可能在G1。
我重新启动了实例:
java -XX:+UseParallelGC -jar server-0.28.0.jar
经过约 20 小时的监控,一切都和以前一样好。 CPU 消耗量与许多天前一样处于 21% 的水平。
Java 9 部署后的 CPU 使用率(6 小时规模):
7 小时后 CPU 增加 + 12 小时“未触及”(7d 规模):
CPU 后 -XX:+UseParallelGC
(24h scale):
所以我的问题是 - 这是 G1 的预期行为吗?其他人看到类似的东西吗?
Ubuntu 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 比 UseParallelGC
多 40%。
最佳答案
(请注意,GC 调优非常依赖环境,因此没有神奇的秘诀。)
与 G1 有一个非常相似的问题。默认情况下,它似乎非常不适合 REST 端点(同样,这只是我在直接附近所经历的)。如 here 所述,对我有帮助的是尝试使用 Gcflags。 .
对我们来说,最大的改进来自 -XX:G1NewSizePercent=25 和 -XX:MaxGCPauseMillis=50。 G1 也会随着时间的推移自动调整自身,因此最大。 GC 暂停限制对所有其他参数都有显着影响。
关于java - 为什么在 Java 9 G1 工作约 6 小时后性能会下降,而负载却没有实际增加?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46582523/