`docker stats`とcAdvisorでDockerコンテナのリソースを監視:CPUとRAMを消費する「犯人」を特定

Docker tutorial - IT technology blog
Docker tutorial - IT technology blog

問題の概要

Dockerを扱っていて、アプリケーションの動作が異常に遅いと感じたことはありませんか?あるいは、サーバー全体が理由もなく重くなったことは?複数のDockerコンテナが同時に動作する環境では、どの「犯人」がシステムリソース(CPU、RAM)を消費しているのかを突き止めることが非常に重要です。監視がなければ、最適化やトラブルシューティングは非常に困難になります。

幸いなことに、Dockerには強力な組み込みツールdocker statsが用意されています。また、コミュニティはよりプロフェッショナルなソリューションとしてcAdvisorを開発しました。この記事では、これら両方の使用方法を詳細に説明します。これにより、コンテナのパフォーマンス問題を簡単に監視、検出し、対処できるようになります。

コアコンセプト

docker statsとは?

docker statsは、Docker CLIに組み込まれたコマンドです。これにより、実行中のコンテナのリソース使用状況をリアルタイムで確認できます。このツールは、各コンテナのCPU、RAM、ネットワークI/O、ディスクI/Oに関する迅速な概要を提供します。パフォーマンスの問題が疑われる場合に、素早く確認するのに理想的な選択肢です。

cAdvisorとは?

cAdvisor (Container Advisor)は、Googleが提供するオープンソースツールです。実行中のコンテナからパフォーマンスとリソース情報を収集、集約、処理、エクスポートするように設計されています。docker statsがリアルタイムデータのみを表示するのに対し、cAdvisorはそれ以上の機能を提供します。視覚的なグラフと詳細な履歴データを提供するため、傾向分析や長期的または定期的なリソース問題の検出に役立ちます。

なぜCPUとRAMの監視が必要なのか?

CPUとRAMは、アプリケーションのパフォーマンスを決定する2つのコアリソースです。これは、アプリケーションがコンテナ内で実行されている場合でも同様です。あるコンテナがCPUを過剰に消費すると、同じDockerホスト上の他のプロセスが遅くなる可能性があります。同様に、RAMが過剰に消費されると、システムはスワップ(RAMからディスクへのデータ交換)を使用せざるを得なくなります。その結果、パフォーマンスが著しく低下し、「Out Of Memory」(OOM)の状態に陥り、アプリケーションが完全にクラッシュすることさえあります。

実践的な手順

1. docker statsによる迅速な監視

docker statsは、コンテナのリソース状況の概要を把握するための最速ツールです。ターミナルを開いて、以下のコマンドを試してみましょう!

基本コマンド: 全てのコンテナを表示

引数なしでdocker statsと入力するだけで、実行中の全てのコンテナのリストと、各コンテナの詳細なリソース情報が表示されます。


docker stats

返される結果は次のようになります:


CONTAINER ID   NAME         CPU %     MEM USAGE / LIMIT   MEM %     NET I/O      BLOCK I/O      PIDS
8e1d5a7d0c3b   my-nginx     0.00%     2.207MiB / 7.769GiB   0.03%     1.57kB / 0B    0B / 0B        2
4b2e1f9c8d7a   my-app       0.23%     125MiB / 7.769GiB   1.61%     6.74MB / 1.2MB   1.5MB / 564kB   15
  • CONTAINER ID / NAME: コンテナのIDと名前。
  • CPU %: コンテナが使用しているCPUの割合。この値が継続的に高い(例:80%以上)場合、コンテナが過負荷になっているか、問題が発生している兆候です。
  • MEM USAGE / LIMIT: コンテナが使用しているRAMの量と、割り当てられた上限(もしあれば)の比較。
  • MEM %: 使用中のRAMの割合。CPUと同様に、この数値が高い(例:70-80%以上)場合、RAM不足の危険性を示します。
  • NET I/O: コンテナが送受信したネットワークデータ量
  • BLOCK I/O: ディスクに読み書きされたデータ量
  • PIDS: コンテナが実行しているプロセスの総数。

特定のコンテナを監視

1つまたは特定のコンテナのみを表示するには、そのIDまたは名前をコマンドに追加するだけです:


docker stats my-nginx my-app

非ストリーミングデータ(一度限り)の取得

時々、リソース状況の「スナップショット」だけが必要で、継続的なデータストリームは不要な場合があります。その際は、--no-streamフラグを使用してください:


docker stats --no-stream my-nginx

Nginxを使った実例

簡単なNginxコンテナを実行し、そのリソースを確認してみましょう!


docker run -d --name my-nginx nginx

その後、docker stats my-nginxコマンドを実行します。アクセスがない場合、NginxのCPUとRAMは通常非常に低いレベルであることがわかります。ブラウザからNginxにアクセスしてみると、CPU使用率がわずかに増加するかもしれません。

2. cAdvisorによる詳細な監視

より深い洞察を得るため、履歴を追跡し、データを視覚化するには、cAdvisorが完璧な選択肢です。便利なことに、cAdvisorもDockerコンテナとして実行されます。

cAdvisorのインストール(Dockerコンテナ内で実行)

以下のコマンドを実行してcAdvisorを起動します。このコマンドはGoogle Container RegistryからcAdvisorイメージをダウンロードします。その後、必要なDockerシステムリソースへのアクセス権を付与して実行されます。


docker run \
  --volume=/:/rootfs:ro \
  --volume=/var/run:/var/run:rw \
  --volume=/sys:/sys:ro \
  --volume=/var/lib/docker/:/var/lib/docker:ro \
  --volume=/dev/disk/:/dev/disk:ro \
  --publish=8080:8080 \
  --detach=true \
  --name=cadvisor \
  gcr.io/cadvisor/cadvisor:latest

引数の説明:

  • --volume=...:ro: システムディレクトリを読み取り専用モードでマウントします。これにより、cAdvisorはシステムや他のコンテナに関する情報を収集できます。
  • --volume=/var/run:/var/run:rw: cAdvisorがDockerデーモンと対話できるように、/var/runディレクトリへの書き込み権限を付与します。
  • --publish=8080:8080: ホスト上で8080番ポートを開放します。これにより、cAdvisorのWebインターフェースにアクセスできます。
  • --detach=true: コンテナをバックグラウンドモードで実行します。
  • --name=cadvisor: コンテナにcadvisorという名前を付けて、管理しやすくします。

コマンドが正常に実行されると、cAdvisorは直ちにデータの収集を開始します。ブラウザでhttp://localhost:8080にアクセスすると、そのWebインターフェースにアクセスできます。リモートサーバーで実行している場合は、http://<IP_SERVER_DOCKER>:8080を使用してください。

cAdvisorインターフェースを探索する

http://localhost:8080にアクセスすると、cAdvisorのインターフェースが表示されます。概要ページ(Overview)には、システム全体のCPUとメモリに関する一般情報が表示されます。各コンテナの詳細を表示するには、左側のサイドバーにある「Containers」タブに移動するだけです。

「Containers」タブでは、アクティブなコンテナのリストが表示されます。任意のコンテナ(例: my-nginxcadvisor)をクリックすると、その詳細なリソースグラフが表示されます:

  • CPU Usage: 時間経過に伴うCPU使用率のグラフです。これにより、ピーク時や異常な時間帯を特定できます。
  • Memory Usage: RAMグラフは、コンテナが閾値を超えているか、メモリリークの兆候があるかを示します。
  • Network Traffic: ネットワークトラフィックのグラフ。ネットワークI/Oに大きく依存するアプリケーションのデバッグ時に役立つ情報です。

これらのグラフが、docker statsと比較した場合のcAdvisorの強みです。傾向やリソースのピークを簡単に確認できます。そこから、履歴データに基づいて正確な最適化の決定を下すことができます。

リソースを「食い尽くす」コンテナの特定

cAdvisorを使用すると、リソースを「食い尽くす」コンテナの特定がはるかに直感的で簡単になります。コンテナのCPUグラフが長時間にわたって高いレベル(例:80-90%以上)を維持している場合、それは兆候です。同様に、メモリグラフが常に上限(もしあれば)に近づいている場合も明確な警告です。この時点で、あなたは次のことができます:

  • そのコンテナのログを確認します。無限ループで実行されているエラーがないか確認します。
  • コンテナが安定して動作するためにより多くのリソースを本当に必要とする場合は、リソース(CPU/RAM)の制限を増やすことを検討します。
  • コンテナ内のコードまたはアプリケーション構成を最適化します。目的は、リソースの負荷を効果的に軽減することです。

Dockerでパフォーマンスの問題をデバッグする際、特にAPIからのJSONレスポンスやコンテナ設定を分析する必要がある場合、生のJSONを読むのは非常に不快だと感じています。私は常にtoolcraft.app/ja/tools/developer/json-formatterを使ってフォーマットしています。このツールは、cAdvisorや他のAPIからのレスポンスデータをはるかに迅速に理解するのに役立ちます。さらに、追加の拡張機能をインストールする必要がないため、かなりの時間を節約できます。

結論

Dockerコンテナのリソース監視は、Dockerを扱うすべての人にとって不可欠なスキルです。docker statsを使えば、コンテナの現在の状況を素早く確認できます。深い分析が必要な場合、傾向を追跡したり、潜在的な問題を探したりする場合には、cAdvisorが強力なツールとなり、視覚的で詳細な情報を提供します。

この監視を日々のワークフローに組み込みましょう。リソースを「食い尽くす」コンテナを早期に発見し対処することは、アプリケーションの安定性を高めるだけでなく、サーバーコストを大幅に最適化します。今すぐ適用を開始してコンテナをマスターし、システムが常にスムーズに動作するようにしましょう!

Share: