200ms以上休止しないようなソフトリアルタイムシステムのコンテキストについては、Full GCが差し迫る前に事前警告を行う方法を探しています。私たちはそれを避けることができないかもしれないが、システムが停止する前に別のノードにフェールオーバーしたいと考えています。完全なGCの前に事前警告を得る
私たちは、システムが数秒間ストールする可能性がある差し迫った完全なGCに先立って、事前の警告を私たちに提供する計画を考え出すことができました。
私たちが思い付くことができたのは、CMSフリーリスト統計に基づいています:-XX:PrintFLSStatistics=1
。これは若いGCを含むすべてのGCサイクルの後に空きリスト統計をGCログに出力するので、情報は短い間隔で利用でき、高いメモリ割り当て率の間隔でさらに頻繁に表示されます。おそらくパフォーマンス面では少しコストがかかるかもしれませんが、私たちの実際の前提は、私たちがそれを買う余裕があるということです。
ログへの出力はそうのようになります。特に
Statistics for BinaryTreeDictionary:
------------------------------------
Total Free Space: 382153298
Max Chunk Size: 382064598
Number of Blocks: 28
Av. Block Size: 13648332
Tree Height: 8
、最大空きチャンクサイズは382064598の言葉です。 64ビットワードの場合、これは2915MBをわずかに下回るはずです。この数値は、1時間あたり約1MBの割合で非常にゆっくりと減少しています。
フリーチャンクの最大サイズが若い世代より大きい限り(気楽なオブジェクト割り当てがないと仮定して)、すべてのオブジェクトプロモーションが成功するはずです。
最近では、数日間のストレステストを実行し、CMSが古い領域の総容量の94%を超える最大チャンクサイズを維持できることが確認されています。フリーチャンクの最大サイズは、1MB /時未満の割合で減少しているように見えます。これにより、すぐに完全なGCになることはなく、メンテナンスのためにサーバーがダウンする可能性が高くなります。フルGCよりも頻繁に発生する可能性があります。
以前のテストでは、システムのメモリ効率が低下した時点で、システムを10時間稼働させることができました。最初の1時間で、フリーチャンクの最大サイズは100MBに減少し、8時間以上滞在しました。最後の40分間は、完全なGCが発生したとき、フリーチャンクの最大サイズは0に向かって一定の割合で減少しました。これは非常に勇気づけました。そのワークロードでは、40分の前進を得ることができたようです警告(チャンクサイズが0に向かって着実に減少し始めたとき)。あなたへ
私の質問:これはすべてが長期のピーク負荷を反映仮定(生産の任意の時点でのワークロードだけ低くなります)、有効なアプローチのようなこのサウンドしていますか?どの程度の信頼性があると思いますか?GCログからチャンクサイズの最大値を計算できるはずです。
私たちは間違いなく提案はしていますが、HotSpot(No Azul、少なくとも今のところは利用できません)で利用可能なソリューションに限定するようリクエストしています。また、Full GC、またはSLAを大幅に上回るGC(および時々発生する可能性のあるGC)の前に警告を発する似たような指標を考え出すことができない限り、G1自体は解決策ではありません。
JRockit Deterministic GCをテストすることは可能でしょうか? http://docs.oracle.com/cd/E15289_01/doc.40/e15071/intro.htm#i1010645 – fglez
私たちはそれを認識しているだけでなく、IBMとOracleの他のリアルタイム製品も認識しています。私たちがHotSpotにも展開できるように、弱い保証(またはヒューリスティックのみ)を持つことが重要です。 – nadavwr
交替ノードで定期的にフルGCを強制的に実行することを検討しましたか?これにより、より予測可能な動作が可能になります。 CMSは、断片化が進むにつれて長期的には予測できません。 – fglez