1つのインスタンス(2 vCPU、2GB RAM、ロード〜4k req/sec)をJava 9(latest Java 8)から)に切り替えました。しばらくの間、すべてが問題なく、CPU使用率は以前と同じでした。ただし、6時間後までは、理由もなくCPU使用量が4%(21%から25%)増加しました。トラフィックの急増はなく、メモリ使用量も増加せず、メトリックの変更もありませんでした(コード内のすべてのメソッドにカウンターがあります。
このインスタンスが元に戻ることを期待して、このインスタンスを約12時間そのままにしておきました。しかし、何も変わっていません。それはちょうどより多くのCPUを消費し始めました。
top
コマンドは、インスタンスにJavaサーバープロセスの場合よりも通常よりも多くのCPUスパイクがあることを示しました。最近、G1は高スループットには適していないことを読んだので、結論を出しました。その理由はG1にある可能性があります。
私はインスタンスを再起動しました:
Java -XX:+UseParallelGC -jar server-0.28.0.jar
また、監視の約20時間後、すべてが以前と同じように問題ありません。 CPUの使用量は、何日も前の21%のレベルです。
Java 9配置直後のCPU使用率(6時間スケール)]:
7時間後のCPUの増加+「そのまま」の12時間(7dスケール):
-XX:+UseParallelGC
の後のCPU(24時間スケール):
だから私の質問は-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)
EDIT 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はUseParallelGC
よりも40%多くのCPUを消費します。
(GCの調整は環境に大きく依存するため、魔法のレシピはありません。)
G1で非常によく似た問題がありました。デフォルトでは、これはRESTエンドポイントに適していると思われます(これも、私が直接近所で経験したものにすぎません)。説明したように、GCフラグの実験に役立ったのは ここ 。
私たちにとって、最大の改善は-XX:G1NewSizePercent = 25と-XX:MaxGCPauseMillis = 50によるものです。 G1も時間の経過とともに自動チューニングしているので、最大です。 GCの一時停止制限は、他のすべてのパラメーターに大きな影響を与えます。