1台の物理サーバ上で複数のDockerコンテナが稼働する環境では、限られたハードウェア資源の利用制限は非常に重要です。
特定のユーザーが使用するコンテナがホストマシンのハードウェア資源を食いつぶすようなことがあれば、他のユーザーのハードウェア資源の利用に支障をきたします。
こうしたことを防ぐためにDockerでは、CPU、メモリ、ディスク、ネットワーク等の資源を管理する仕組みが備わっています。
今回はCPUとメモリの利用制限の方法を紹介したいと思います。
目次
DockerのCPU資源管理
Dockerは、1つのCPUコアを複数のコンテナで利用しますが、そのCPUを割り当てる時間の割合をコンテナ実行時に指定するという方法を採っています。そしてコンテナにはCPUの割当時間の割合を示すための相対値が与えられています。
CPUの資源管理の例
それぞれのコンテナのCPUの相対値には、標準では1024という値が割り当てられるのですが、いくつか具体的な例を示します。
例1
1コアのCPUに3つのコンテナが稼働しており、コンテナ1、コンテナ2、コンテナ3にそれぞれ1024という値を指定しているとします。
この場合、すべて同じ値ですので、CPU時間は、均等に割り振られるという意味になります。
各コンテナに割り当てられるCPU時間は、100%の3等分で、約33.3%となります。
CPUの割当例1
– | コンテナ1 | コンテナ2 | コンテナ3 |
---|---|---|---|
CPU割当時間の相対値 | 1024 | 1024 | 1024 |
CPU割当時間 | 約33.3% | 約33.3% | 約33.3% |
例2
コンテナ1に1024、コンテナ2とコンテナ3には512という値を割り当てると、コンテナ2とコンテナ3には、コンテナ1に比べて半分の時間しかCPUが割り当てられません。
CPUの割当例2
– | コンテナ1 | コンテナ2 | コンテナ3 |
---|---|---|---|
CPU割当時間の相対値 | 1024 | 512 | 512 |
CPU割当時間 | 50.0% | 25.0% | 25.0% |
CPU割当時間の確認
先程の例で示したCPU割当時間を実際に確かめてみます。CPU割当時間の割合を確認するには、ホストOS上のtopコマンドでも確認出来ますが、ここではより視認性が高い、htopコマンドを使って確かめてみましょう。
htopのインストール
htopはEPELリポジトリで提供されていますので、ホストOSにリポジトリを追加し、htopをインストールします。
1 2 |
# yum install -y epel-release # yum install -y htop |
CPUの割当時間の設定:例1
ここで利用するDockerイメージは、CentOS 7.5.1804のOSテンプレートのDockerイメージです。
入手していない場合には、事前にdocker image pullで入手しておいてください。
1 |
# docker image pull centos:7.5.1804 |
それでは実際に例1を確認します。CPU割当時間の値は、docker container run実行時に–cpu-sharesオプションを付与します。
cpu-sharesの数値を全て同じ1024にしてDockerコンテナを3つ稼働させます。
1 2 3 |
# docker container run -itd --name test01 --cpuset-cpus=0 --cpu-shares=1024 centos:7.5.1804 dd if=/dev/zero of=/dev/null # docker container run -itd --name test02 --cpuset-cpus=0 --cpu-shares=1024 centos:7.5.1804 dd if=/dev/zero of=/dev/null # docker container run -itd --name test03 --cpuset-cpus=0 --cpu-shares=1024 centos:7.5.1804 dd if=/dev/zero of=/dev/null |
実行例のうち、–cpuset-cpus=0は、ホストOS側のCPUコアの番号を指定しています。こうすることで、3つのコンテナをCPUコア0番で固定して稼働させることが出来ます。
結果の確認:例1
htopコマンドで、結果を確認してみます。[F6]を押すと、項目別にソートできるので、[PERCENT_CPU]を選択し、Enterキーを押します。その後で上矢印キーを押し続け、CPU利用率の高いプロセスの上位を表示させます。
htopの結果の通り、CPUコア0番(htopの表示では1番のCPU)の負荷が高い状態になり、ddコマンドを実行している3つのプロセスの[CPU%]の値が、およそ33%前後になっていることがわかります。
CPUの割当時間の設定:例2
続いて例2を確認します。cpu-sharesの数値を変えてDockerコンテナを3つ稼働させます。
1 2 3 |
# docker container run -itd --name test04 --cpuset-cpus=0 --cpu-shares=1024 centos:7.5.1804 dd if=/dev/zero of=/dev/null # docker container run -itd --name test05 --cpuset-cpus=0 --cpu-shares=512 centos:7.5.1804 dd if=/dev/zero of=/dev/null # docker container run -itd --name test06 --cpuset-cpus=0 --cpu-shares=512 centos:7.5.1804 dd if=/dev/zero of=/dev/null |
結果の確認:例2
htopコマンドで、結果を確認してみます。
htopの結果の通りddコマンドを実行している3つのプロセスの[CPU%]の値が、およそ50%と25%前後になっていることがわかります。
以上がCPUの資源管理(割当変更)の方法となります。
CPUコアの変更
次にDockerコンテナに割り当てられるコア自体の変更方法について説明します。Dockerコンテナ起動時のオプション–cpuset-cpus=XXで、Dockerコンテナに割り当てるCPUコアを指定することが可能です。また、docker container updateコマンドを利用すれば、稼働中のDockerコンテナに割り当てられたCPUコアを変更することも可能です。
CPUコアの指定 例
–cpuset-cpus 0 #CPUコア0を使用
–cpuset-cpus 0-2 #CPUコア0~2を使用
–cpuset-cpus 1,2 #CPUコア1と2を使用
CPUコアの割り当て確認
稼働中のDockerコンテナに割り当てられたCPUコアを確認するには、docker container inspectコマンドを利用します。コンテナ名core01に割り当てられたCPUコアを確認する場合には下記のようなコマンドになります。
1 2 3 |
# docker container inspect --format='{{.HostConfig.CpusetCpus}}' core01 結果 0 |
現在、コア0が割り当てられていることが分かりました。
CPUコアの割り当て変更
稼働中のDockerコンテナに割り当てられたCPUコアを変更するには、docker container updateコマンドを利用します。コンテナ名core01に割り当てられたCPUコアを1に変更する場合には下記のようなコマンドになります。
1 |
# docker container update --cpuset-cpus=1 core01 |
割り当てられたコアを確認すると変更されていることが確認出来るはずです。
1 2 3 |
# docker container inspect --format='{{.HostConfig.CpusetCpus}}' core01 結果 1 |
DockerのCPU資源管理の手順は以上となります。
メモリ容量の制限
Dockerのメモリ資源管理は、Dockerコンテナが使用できる最大メモリ容量を-mオプションで指定することで行います。単位には、b(バイト)、k(キロバイト)、m(メガバイト)、g(ギガバイト)を指定出来ます。
以下は、最大512Mバイトのメモリ容量までが利用可能なDockerコンテナmem01を起動する例です。
1 |
# docker container run -m 512m -it --name mem01 centos:7.5.1804 /bin/bash |
コンソールにログインするため、-itdでなく-itとします。
-dはバックグラウンドで稼働させるためのオプションです。
メモリ容量制限のテスト
稼働中のDockerコンテナのメモリ容量が制限されているかどうかは、コンテナで、メモリ使用率を上昇させるプログラムを稼働させることで確認出来ます。メモリ使用率を上昇させるには、yesコマンドを使って、bashプロセスのメモリ使用率を徐々に上げていく方法がありますのでそれを使います。
1 |
[root@d7bd8f0693c5 /]# /dev/null < $(yes) |
Docker コンテナ mem01のメモリ容量は、[512Mバイト]に制限されている為、htopの画面のRES列に表示されるメモリ使用量が上限の512Mになっていることが確認出来るはずです。
DockerにおけるCPUとメモリの資源管理の説明は以上です。
比較的手軽に始められるのがDockerの魅力ですが、本格的な運用をしていく場合には今回紹介した容量制限のテクニックが必要になってくるはずです。
資源が足りなくなって、後から調整に苦労した。ということにならないように資源管理は計画的に行いましょう。