web-dev-qa-db-ja.com

ドッカーマシンのメモリ割り当て

かなり複雑なRailsアプリが単一の物理ホストにデプロイされようとしています。ホストには8つのコアと128GBのRAMがあります。

アプリは4種類のコンテナでドッキングされています

  • レール株式会社ウェブサーバー
  • Postgres DB
  • Redis DB
  • ワーカーコンテナー(Resque)

RailsおよびWorkerコンテナーは、docker-machine内により多くのコンテナーを追加することでスケーリングされます。

開発環境では、docker-machine全体にメモリが割り当てられます。

docker-machine create -d virtualbox --virtualbox-memory 8192 default

個々のコンテナが制限されるメモリの量を制御することは可能ですか?

たとえば、Postgresに16GBを割り当てますが、Railsコンテナを4GBに制限します。docker-machineを実行しているサーバーHostにどのような最小メモリを割り当てる必要がありますか?これは可能ですか?

[〜#〜]編集[〜#〜]

関連する質問:

Dockerメモリ管理の処理方法

Docker + Apache、メモリ使用量はどのように機能しますか?

編集2

この回答 https://serverfault.com/a/645888/210752 は、コンテナが必要に応じてメモリを割り当てることを示しています。これは、開発環境での私の経験ではありません(デフォルトでdocker-machineには2GBが割り当てられていました)。

5
ardochhigh

2回目の編集での質問への回答で述べたように、コンテナーは仮想マシンとは異なり、通常は仮想マシンの場合のようにコンテナーを予約しません。それらはすべて同じOSで実行されるため、コンテナー内で実行されていない場合と同様に、必要に応じて異なるプロセスにメモリをディスパッチできます。 つまり、メモリは、コンテナに関係なく、すべてのプロセスに対してプールされます。

上記の例でdocker-machineを使用して設定したのは、「仮想」ホストの合計メモリプールです。本番環境では、128 GB全体になります(DockerマシンまたはVMを使用してセグメント化する予定がない場合)。

ただし、コンテナーは、カーネルのcgroups(コントロールグループ)機能を利用する優れた方法でもあり、コンテナーシステム全体のリソース管理を構成できます。 。これにより、コンテナーにメモリを「予約」することはできませんが、代わりにすべてのコンテナーメモリに上限を設定して、他のユーザーに使用される可能性のあるメモリを使い果たしないようにすることができます(たとえば、リークやバグが発生した場合)。 )。

Dockerでは、使用するコンテナバックエンドに応じて、次のように基本的なメモリ制限を設定できます。

  • Dockerのデフォルトのlibcontainerを実行するときは、-mまたは-memoryオプション
  • レガシーLXCプロバイダーを実行する場合、LXCオプションlxc.cgroup.cpuset.memory= amount using-lxc-conf

Dockerでのcgroupsの使用に関する詳細情報は、次の場所にあります。 https://www.cloudsigma.com/manage-docker-resources-with-cgroups/

この記事には、cgroups機能の概要のスライドも含まれています。

4
Fira