2017-04-05 11 views
2

私はまだkubernetesで私の足を私の下に置いています。 AWSのKubernetes 1.4.2で実行されている〜17個のマイクロサービスを備えたSpring-Bootベースのアプリケーションがあります。このアプリケーションを4 m3.mediumワーカーのAWSクラスタで実行すると、私のコンテナは、休息状態で200-300 MBのメモリ使用量になります(いくつかの例外を除いて)。生産のために、4m4の大きな作業員に同じセットのサービスをインストールし、即座に私のメモリは、ほぼ同じ仕様の同じコンテナに700-1000MBのメモリを移動しました。私はSpringboot、Docker、Kubernetesの誰が怒っているのか理解しようとしています。Kubernetesポッドは大きなマシンであまりにも多くのメモリを使用しています

誰もこのような行動を見たことがありますか?

私はKubernetesの制限を使ってリソースを制限することができますが、アプリケーションが小さいマシンでうまく動作し、フットプリントが小さいことがわかっているので、実際にはしたくありません。問題がどこにあるかについてのアドバイスを探してください。

EDIT:もう1つの情報または関連情報。私はホストOSイメージとしてCoreOS stable 1298.6.0を使用しています。

+0

GKEでakkaワーカーを実行しているのとまったく同じ問題がありました。ポッドはn1.standardマシンで500mbの制限でうまく動作し、2000mbの制限でn4.standardマシンに移動すると、限界を突破して追い出されるようになりました(これは本当にメモリ使い方は変わりません) –

+0

アプリケーションは、マシンの容量に基づいてリソース使用量(プロセス数/スレッド数など)を調整しますか?アプリケーションがメトリックを提供する場合は、サイドバイサイドの比較を行うことができます。 –

+0

これは非常に巧妙な質問ですが、私はテストに入れたいと思っていますが、この問題は私の以前の仕事で起きたので、私はもはやそのメトリクスにアクセスできなくなりました。私が再現することができれば、私はこれらのことを確認するでしょう。 –

答えて

1

私の意見では、問題は、コンテナ内のプロセスが利用可能なRAMとして使用可能な合計ホストRAMを認識していることです。

より大きなインスタンスを使用する場合、JVMはさらに多くのRAMを使用しようとします。 -Xmx300mでjava仮想マシンのヒープを制限しようとする必要があります(この値をあなたのアプリケーションに必要なものに合わせてください)。 thisの記事を読んで、その説明が簡単でクリーンな方法であることをお勧めします。

+0

この記事は感謝します、ありがとう。面白いことに、まだ環境によって違いがあります。私は、リソース制限を使って設定することは、ポッドがOOMとしてk8sで終了する前に、ほんの少ししか得ることができないことを発見しました。私がenv変数として設定すると、私は小さくなる可能性がありますが、メモリはまだ驚くほど高かったです。参照用: - デプロイメントのスペック制限私は〜350MB以上になる可能性があります(リソース要求175Mi /制限350Miを設定します) - env変数を使用して設定しましたが(私は-Xms64m -Xmx128mを設定しました)、k8自体ではポッドはまだ〜290MB - m3マシンで無制限の場合、ポッドは260MBを超えることはありません – Mark

+0

他の誰かが上記の記事で扱われていないもう1つのメモに興味がある場合。さらに、-XX:MaxMetaspaceSize = を使用してJava 8のメモリを制限することもできますが、それを実行するマシンのサイズに関連していると思われる各コンテナにいくつかの追加メモリが割り当てられています。最終的に、私はXmx + -XX:MaxMetaspaceSize +〜60-70MBが私の小規模サービスのための私の合計コンテナサイズを与えたことを発見しました。 – Mark

関連する問題