2016-04-17 4 views
2

私の会社では、JVMベースのマイクロサービスでアプローチを試みています。それらは水平にスケーリングされるように設計されているため、比較的小さなコンテナ(最大2Gヒープ、通常は1-1.5G)を使用して、それぞれ複数のインスタンスを実行します。使用するJVMは1.8.0_40-b25です。小さなヒープを持つマイクロサービスのXmx/GCのデフォルトの設定

このようなインスタンスのそれぞれは、最大250 MB/sのメモリ割り当て率で最大100 RPSを処理します。

問題は、どのような種類のGCが最初から安全で分かりやすいデフォルトになるのでしょうか?これまで、Xms = Xmx(ヒープリサイズ中のポーズを避ける)とXms = Xmx = 1.5GのCMSを使用しています。結果はまあまあです - メジャーGCが実行されたことはほとんどありません。

私はG1が(全体のスループットを犠牲にして)より小さい休止を与えることができることを知っていますが、AFAIKは適切に動作するにはもう少し「呼吸」スペースと少なくとも3-4Gのヒープが必要です。

ヒント(Azul's Zing:Dに行く以外に)

+0

実際にデータを投稿せずに「結果はまともだ」と言います。 GCログ、JVMオプション、システム構成、相対的なゴールの優先順位(平均ワーストケースの一時停止時間/スループット/フットプリント)などがあります。 – the8472

+0

私は解決策ではなくヒントを求めています。さらなる最適化/分析を開始するのに十分な場所を探しています。 –

+0

としてください。その後、oracleのGCチューニングガイド(すべて)を読み、GCViewerを使用してください。 – the8472

答えて

2

ヒント#1:実験を行う

マイクロサービスが少なくとも2つのノードに配置されていると仮定すると、1つはCMSで、もう1つはG1で、もう1つは応答時間です。

G1のパフォーマンスが元のクラスターサイズの半分を必要とするほど良いとわかっていればどうでしょうか?

サイドノート:

  • 再:「250MB/sの」 - >このすべては、メモリ(それは若い世代だ場合、代わり、)コレクションは、これらの領域を形成するので、その後G1はほとんど利益を提供するだろうが自由であるスタックされている場合。
  • : "100 RPS" - 多くの場合、私たちのプロダクションでは、(プロキシ設定またはアプリケーションコンテナレベルのいずれかを介して)システムの同時リクエストを減らすとスループットが向上することがわかりました。小さいヒープを考えると、小さなCPU数(2〜4)がある可能性が非常に高いです。
  • さらに、公式のOracleヒントon tuning for a small memory footprintがあります。それは1.8_40で利用可能な最新の設定を反映していないかもしれませんが、とにかく読むのは良いです。
+0

ご返信ありがとうございます。Censumは、ほとんどのオブジェクトが6つのマイナーGCよりも長く生きているとは言えないので、適切な質問があります。マイナーGCのSTWポーズをさらに最小限に抑える方法: –

1

フルGC後にどれだけのメモリが保持されるかを測定します。マイナーGCをどのくらいの頻度で保持したいかによって、1秒間に割り当てられるメモリの量を2〜10倍に増やしてください。例えば2秒ごとまたは10秒ごとに実行されます。

など。完全なGCとGCingの後に最大500 MBが2秒ごとに保持され、500 MB + 2 * 250 MB、または約1 GBのヒープを持つことができます。

RPSの数は重要ではありません。

+0

これは良いアドバイスです。メモリプールサイズ(eden、s1/s2)で遊ぶのが良い選択だと思いますか?あまりにも大きな若い世代は休憩時間をかなり増やすことになると私は恐れている。 –

+0

@ R4J Edenのサイズを大きくすると、休止時間が長くなることがありますが、このタイミングはアプリケーションによって異なります。あなたが500 MBのエデンを言うなら、それは何の違いもないかもしれません。注:私はしばしば24 GB Edensを実行します。 ;) –

+0

24GB?営業時間終了後にGCを遅らせるには? –

関連する問題