Javaアプリケーションを実行しているマルチDockerコンテナーのAWS Elastic Beanstalk環境にメモリを動的に割り当てる方法


8

無料のエラスティックbeanstalk層から可能な限りのオンスの使用を絞り出したいと思います。

私のバックエンドは、(ktorを使用して)マイクロサービスのセットとして構築されています。正確には5つのマイクロサービスがあります。これらはすべてドッキングされており、マルチDocker イメージ環境で同じ小さなt2.micro(無料)エラスティックBeanstalkインスタンス上ですべて実行しようとしています

JavaはJavaなので、最も単純なマイクロサービスでも、Dockerコンテナーごとに約200 MBのRAMをアイドル状態にするのが好きです。

したがって、t2.microは1GBのRAMを提供します。5つのマイクロサービスDockerコンテナーがあり、それぞれに少なくとも200 MBを要求する=本当に近い。

問題は、メモリがほぼ常に100%に激しくホバリングしていることです。

では、どれだけの空きがあり、どれだけ必死に1つのコンテナがメモリを必要としているかに応じて、Dockerコンテナにメモリを動的に割り当てる方法はありますか?

1つのコンテナーが重い負荷をかけている間に、他のコンテナーはほとんどアイドル状態になっているとしたら、RAMを重いタスクを実行しているコンテナーに向け、タスクが終了したら、コンテナーごとの等しいRAM割り当てに戻します。

これを行う方法はありますか?

回答:


1

を使用docker update --memory-reservation xxx <container>して、コンテナの実行中にコンテナのソフト制限メモリ割り当てを変更できます。Dockerは、全体的なメモリが少なくなると、コンテナをそっとソフトリミットまで押し下げます。したがって、すべてのコンテナに150 MBなどのソフト制限を設定し、追加の作業が必要なことがわかったら、そのうちの1つを上げることができます。

ソフト制限に関するDockerのドキュメントはそれほどすばらしいものではありません。CGroupMemoryのカーネルのドキュメントでは、それについてより詳しく説明しています。


よろしくお願いします。理想的には、たとえば、複数のコンテナのメモリ使用量を動的に監視し、(パフォーマンスを最大化するために)いつでも最高に近い状態で実行されているコンテナにより多くのメモリを提供するソリューションが必要です。彼らはなどcronジョブタイミング、トラフィックに依存する場合がありますように、サーバー上で、本当に手動限界を変え続けることが可能ではないでしょう
アーディティヤアナンド

メモリ管理がない場合とどう違うのですか?あるコンテナのJVMインスタンスがメモリ割り当てを要求していて、別のコンテナの別のJVMインスタンスが未使用のヒープ領域を保持している場合、2番目のJVMはそれをあきらめ、最初のJVMにそれを許可します...そうですか?
CantankerousBullMoose

そうですか?この件に関する信頼できる情報源にリンクできますか?私の経験では、それは少しランダムなようです。場合によっては、インスタンスが他のインスタンスを使い果たしても、インスタンスが未使用のヒープを保持することを選択することがあります。
Aditya Anand

1
これは、Dockerの問題よりもJavaの問題のように聞こえ始めています。私はそれらをいじるのに多くの時間を費やしていませんが、-XX:MaxHeapFreeRatioと-XX:MinHeapFreeRatioは、JVMがOSからメモリをどの程度積極的に取得して与えるかを制御することになっています。多分それはあなたにもっと一貫した結果を与えるでしょうか?Oracleのドキュメントガベージコレクションでは、それらのフラグのいくつかの詳細を持っています。
CantankerousBullMoose

はい、これは実際には、Javaプロセスを提供できる静的な開始構成のみを制御し、必要に応じてさまざまなプロセスに割り当てられたメモリを動的に管理する方法は制御しません。
Aditya Anand
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.