あなたのコンテナは大丈夫? 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 」が 90〜100 付近でずっと推移するではないですか!
この現象は、 Vagrantfile 内の設定値「 $vm_memory 」「 $vm_cpus 」を変更しても変わることはありませんでした。
docker stats コマンドでコンテナのリソース使用状況を確認する
Vagrant に依存していないとなると、怪しいのは Docker ということになります。
コンテナを立ち上げている状態で、コンテナのリソース使用状況が分かる docker stats コマンドで確認してみます。
docker stats (コンテナ1) (コンテナ2) (コンテナ3) …
※コンテナは複数指定可能です
結果は一目瞭然です。
今回は、このコンテナの CPU 使用率が異常に高いのが原因でした。
cpu_quota を対象のコンテナの設定欄に設定する
対象のコンテナを Docker Compose の対象から外すことができるのならそれが一番手っ取り早いですが、そういう訳にもいきません。
なんとか構成はそのままで CPU 使用率を下げたいです。
そこで Docker 公式サイトの Compose file 欄を確認します。
CPU 使用率に関する設定として「 cpu_shares 」「 cpu_quota 」「 cpuset 」とありますが、今回のケース(特定のコンテナの使用率のみが高い)で有効な設定は「 cpu_quota 」です。
これは「タスクスケジューラー( CFS )が時間あたりに対して CPU に割く時間(マイクロ秒で指定)」のことで、
このように、使用率を抑えたいコンテナの設定欄に 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 使用率が 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で何が便利になるかまとめてみた
-
お問い合わせ
SiTest の導入検討や
他社ツールとの違い・比較について
弊社のプロフェッショナルが
喜んでサポートいたします。 -
コンサルティング
ヒートマップの活用、ABテストの実施や
フォームの改善でお困りの方は、
弊社のプロフェッショナルが
コンサルティングいたします。
今すぐお気軽にご相談ください。
今すぐお気軽に
ご相談ください。
(平日 10:00~19:00)
今すぐお気軽に
ご相談ください。
0120-315-465
(平日 10:00~19:00)
グラッドキューブは
「ISMS認証」を取得しています。
認証範囲:
インターネットマーケティング支援事業、インターネットASPサービスの提供、コンテンツメディア事業
「ISMS認証」とは、財団法人・日本情報処理開発協会が定めた企業の情報情報セキュリティマネジメントシステムの評価制度です。