web-dev-qa-db-ja.com

Java 9 G1が実際に負荷を増加させずに動作した後、6時間後にパフォーマンスが低下するのはなぜですか?

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時間スケール)]:

enter image description here

7時間後のCPUの増加+「そのまま」の12時間(7dスケール):

enter image description here

-XX:+UseParallelGCの後のCPU(24時間スケール):

enter image description here

だから私の質問は-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を消費します。

48

(GCの調整は環境に大きく依存するため、魔法のレシピはありません。)

G1で非常によく似た問題がありました。デフォルトでは、これはRESTエンドポイントに適していると思われます(これも、私が直接近所で経験したものにすぎません)。説明したように、GCフラグの実験に役立ったのは ここ

私たちにとって、最大の改善は-XX:G1NewSizePercent = 25と-XX:MaxGCPauseMillis = 50によるものです。 G1も時間の経過とともに自動チューニングしているので、最大です。 GCの一時停止制限は、他のすべてのパラメーターに大きな影響を与えます。

2
Agoston Horvath