あなたのコンテナは大丈夫? Docker コンテナの CPU 使用率を抑える方法 | SiTest (サイテスト) ブログ

メニューボタン閉じるボタン

あなたのコンテナは大丈夫? Docker コンテナの CPU 使用率を抑える方法

開発環境や本番環境で Docker を使用しているプロジェクトは多いと思います。
コマンドひとつでコンテナの作成・開始・停止・破棄等、気軽にしかも高速にできてとても便利ですよね。
でも、コンテナを開始してしばらく経つとあなたの PC のファン、音を立てて回っていませんか? CPU 使用率、異様に高くありませんか?
(最近の私のローカル環境がそうでした。。)

そこで今回は Docker コンテナの CPU 使用率を確認し、使用率が高いコンテナについてはそれを抑える方法をご紹介します。

現象の確認

環境の構成

環境:

Mac OS ver. 10.11.6
Vagrant ver. 1.8.6
VirtualBox ver. 5.1.22r115126
Docker Compose file ver. 1

ボトルネックはどこなのか順を追って見ていきます。
今回は、 Vagrant + Docker Compose での複数コンテナ運用下を例にあげます。
Vagrant で仮想環境を立ち上げ、その仮想環境下から Docker Compose を実行し、複数コンテナを立ち上げています。

Vagrant の起動である vagrant up コマンド実行時、当然ながら一時的に CPU 使用率が高い状態になりますが立ち上がった後は落ちます。
(尚、 up した後にアクティビティモニタを確認すると「 VBoxHeadless 」というプロセスが表示されているのが分かります。
これは VirtualBox で仮想環境を構築すると作成されるプロセスです。)

その後仮想環境に ssh ログインし Docker Compose ファイルが格納されているディレクトリ先まで移動し、 docker-compose コマンドで複数コンテナを立ち上げます。

VBoxHeadlessのCPU使用率が高い

するとどうでしょう。しばらくすると VBoxHeadless の 「 % CPU 」が 90〜100 付近でずっと推移するではないですか!
この現象は、 Vagrantfile 内の設定値「 $vm_memory 」「 $vm_cpus 」を変更しても変わることはありませんでした。

docker stats コマンドでコンテナのリソース使用状況を確認する

Vagrant に依存していないとなると、怪しいのは Docker ということになります。
コンテナを立ち上げている状態で、コンテナのリソース使用状況が分かる docker stats コマンドで確認してみます。

docker stats (コンテナ1) (コンテナ2) (コンテナ3) … 

※コンテナは複数指定可能です

結果は一目瞭然です。

特定のコンテナのCPU使用率が高い

今回は、このコンテナの CPU 使用率が異常に高いのが原因でした。

cpu_quota を対象のコンテナの設定欄に設定する

対象のコンテナを Docker Compose の対象から外すことができるのならそれが一番手っ取り早いですが、そういう訳にもいきません。
なんとか構成はそのままで CPU 使用率を下げたいです。

そこで Docker 公式サイトの Compose file 欄を確認します。

CPU 使用率に関する設定として「 cpu_shares 」「 cpu_quota 」「 cpuset 」とありますが、今回のケース(特定のコンテナの使用率のみが高い)で有効な設定は「 cpu_quota 」です。
これは「タスクスケジューラー( CFS )が時間あたりに対して CPU に割く時間(マイクロ秒で指定)」のことで、

cpu_quotaを設定する

このように、使用率を抑えたいコンテナの設定欄に cpu_quota: 20000 と設定すると、CPU 使用率を 20% に抑えることができます。

補足: cpu_quota, cpu_period オプションについて

ここで気に留めておくこととして、「 cpu_quota 」は本来「 cpu_period 」というオプションと併せて使用するのが一般的だということです。
「 cpu_period 」とは、「タスクスケジューラーのスケジュール期間」のことで、スケジュール期間に対してどれだけの期間 CPU に割くかというロジックで設定をすることになります。
しかし、 cpu_period は、 docker run コマンドのオプションとしては存在しますが、 Docker Compose の設定としては存在しません。
よって、 Docker Compose では cpu_quota のみで設定を行うことになります。

尚、 cpu_period のデフォルト値は100ミリ秒(100000マイクロ秒)です。
※ ( 20000 / 100000 ) × 100 = 20 %

参考:https://docs.docker.com/engine/reference/run/#cpu-period-constraint

既存のコンテナを再作成して確認

Docker Compose ファイルの編集が完了したら、設定が反映できているか確認しましょう。

docker-compose start コマンドでは過去の設定で作成したコンテナを開始するだけなので、 docker-compose rm -f コマンドで一度既存のコンテナを破棄してから、 再作成するようにしてください。

docker-compose rm -f
docker-compose -f (composeファイル名) up -d

up したのが確認できたら再び docker stats コマンドで確認しましょう。

CPU使用率が下がった

CPU 使用率が 20% 前後で落ち着いています!これでファンが高速で回ることはないでしょう。

※当然のことながら、使用率を下げるということは対象コンテナ上の処理のパフォーマンスを下げるということになりますので、バランスは大事です。

状況に併せて最善の環境を!

いかがでしたでしょうか?
「 CPU 使用率が高い」ということは必ずしも悪いということではありませんが、常時高い状態が続いていると他のアプリケーションにも影響したりファンが高速で回ったりとやはり気になります。
適宜、ご自身の快適な環境に調整してみてください。

補足:

今回は Docker Compose file version 1 で設定を行いましたが、Docker Compose のフォーマットは version 2, 3とあり、バージョンによっては設定が異なる可能性があります。
また「 cpu_period 」のように、 docker run コマンドでは使えるが Docker Compose では使えないといった設定もあるので、詳細は公式のドキュメントを参照するようにしてください。
・docker run : https://docs.docker.com/engine/reference/run/
・docker compose : https://docs.docker.com/compose/compose-file/

その他 Docker に関するこんな記事はいかがですか?

python環境を、dockerに移行してみた(Mac版)
1コマンドで作った。Dockerで開発環境を構築する方法
新時代のWeb開発現場はどうなる?Vagrant + Dockerで何が便利になるかまとめてみた

今すぐお気軽に
ご相談ください。

0120-315-465

(平日 10:00~19:00)

今すぐお気軽に
ご相談ください。

0120-315-465

(平日 10:00~19:00)

グラッドキューブは
「ISMS認証」を取得しています。

認証範囲:
インターネットマーケティング支援事業、インターネットASPサービスの提供、コンテンツメディア事業

「ISMS認証」とは、財団法人・日本情報処理開発協会が定めた企業の情報情報セキュリティマネジメントシステムの評価制度です。

いますぐ無料で
お試しください。

SiTest の革新的な機能を
お試しいただけます。
利用規約

お名前【必須】
メールアドレス【必須】
電話番号【必須】