2017-03-28 14 views
0

Linuxでは、Javaで約200個のマイクロサービスを実行しており、cpuとメモリ分離のためにc-groupを使用しています。私たちが発見したことの1つは、Javaが(メジャーな)ガベージコレクションを効率的に実行するためにCPUの完全なコアを必要とする傾向があることです。単一サーバ上の複数のjvmsのガベージコレクションをスケジュールする

明らかに、実行中のアプリケーションが200個、CPUが24個の場合は、同時にすべてのGCがGCグループに限定されることになりました。アプリケーションのCPU使用量が比較的少ない(1CPUピークの約15%)ので、同時にすべてのGCを保証する方法を見つけるのは良いことです。

私は、GCごとに同時にGCを設定しないようにして、ホストあたり200個以上のアプリケーションを実行できるようにしましたが、誰かがこのトピックに関する提案や経験を持っているかどうか疑問に思っていましたホイールを発明しようとする前に。

私は、実際にGCを起動するためにMBeanを使用するだけでなく、使用できるコマンドラインメソッドがあることを発見しましたが、これは非決定論的なプロシージャを混乱させるのでGCの場合。

パフォーマンスメトリックを使用してCPU、メモリ、トラフィックを監視してGCを試して予測すると、複数のGCがGCごとに1つずつ起動される可能性がありますが、実用的でないか、または悪い考えかもしれない。

我々はそれが配分率に依存するのであなたは、GCをスケジュールすることはできませんのJava 7を実行している、と8

+1

200個のJVMがすべてのGCを同時に、あるいはそのかなりの割合で使用することはほとんどありません。 – EJP

+0

あなたは実際にその問題を観察しましたか? – the8472

+0

いいえ、問題は発生していません@ the8472 – sub

答えて

0

されている - すなわちそれは、負荷とアプリケーションのロジックに依存します。ガベージコレクタの中には、GCに要する総時間、GCで消費された合計時間を制御しようとしますが、速度は制御しません。外部からトリガされたGC(例:MBean経由)が実際に実行される保証はなく、実行すると後で実行される可能性があるという保証もありません。

他の人が指摘したように、非常にまれな可能性があります(すべてのアプリからメジャーなGCの平均時間(秒)を集計し、ヒストグラムを書き込むことで計算できます) 。 「重い」負荷の下では、CPUの不足に直面する可能性が高いのは、割り振り率の増加による同時GCが起こる可能性があるからです。これは、オブジェクトのサイズに応じて「ロット」を「long」 "古い世代を汚染して主要なGCを引き起こすために生きているオブジェクト。

関連する問題