MackerelとCloudWatchのCPU使用率表記を整理する #mackerelio

こんばんわ、札幌のヨシエです。
日々寒くなる一方、雪まつりなどのイベントが多い日々で札幌は盛り上がっております。

今回、Mackerelを利用した監視を行う時にCPU使用率の表示が変わることについて整理しましたので共有します。

概要

これまでにCloudwatchで監視を行っていたEC2インスタンスにMackerel-Agentを導入すると、MackerelでのCPU使用率最大値が異なることに気づくかと思います。
そこで、このように表記が変わる理由は何かを確認するべく、それぞれがどのようにCPU使用率を取得していることから確認しました。

検証環境

  • EC2インスタンス
    • インスタンスタイプ:m5.large
    • OS:AmazonLinux
    • vCPU数:2vCPU
    • メモリ数:8GiB

以下のブログで紹介されているstressを使用し、上記インスタンスへ特定時間負荷をかけました。

EC2でサーバーに負荷を発生させる stress ツールを使ってみる

使用した負荷コマンドは以下になります。

# stress -c 2 -t 600

まずはCloudWatch,Mackerelのメトリック表記を見ていきましょう。

Cloudwatchメトリック

Mackerelメトリック


このようにCloudwatchでは最大値が100%となっておりますが、Mackerelでは最大値が200%と記載されております。
この表記の差はどういったものかを整理します。

まず、CloudWatchのCPU使用率はBlackbeltにて以下のように書かれております。

この記載とvCPUが複数あるインスタンスの確認結果より、ハイパーバイザーがEC2インスタンスのCPU使用率を全コア分まとめて算出した結果が100%上限という考えられます。

一方、Mackerelに関してはインスタンスごとに起動しているmackerel-agent自身がインスタンス内部のコア数に応じてCPU使用率をそれぞれ算出し、グラフ描画されているものと考えられます。

この取得方法が違うことで表記が異なるものと考えられます。

以下はメトリックをPUTする流れを図に表したものです。

CloudWatch

Mackerel(AWSインテグレーション)

Mackerel(mackerel-agent)

このように取得方法が異なることで纏めているか纏めていないかの差で表記が変わっていることがわかりました。

ここでおまけというわけではないですが、今回のようにCPU使用率が100% * CPU数のように見慣れないパターンやコア数毎のグラフが欲しい場合に有効と思われるMackerel-agentのmulti-coreプラグインをご紹介します。

multi-coreプラグインとは?

上記で記載したようにmackerel-agentのみでCPU使用率を監視すると、最大値が100% * CPU数の値で表示されます。
この場合、マルチコアCPUでCPUリソース確認が厳しいことから各CPU使用率確認を実現するために作られたプラグインです。

CPUの監視 ~ mackerel-plugin-multicoreを読み解く

導入方法(AmazonLinux)

Mackerel-Agentをインストール

# curl -fsSL https://mackerel.io/file/script/amznlinux/setup-all-yum.sh | MACKEREL_APIKEY='<APIキー>' sh

mackerel-agent pluginをインストール

mackerel-agentの公式プラグイン集をインストール

# yum install mackerel-agent-plugins

mackerel-agent.conf修正

mackerel-agent.confのバックアップ取得

# cp /etc/mackerel-agent/mackerel-agent.conf{,.bk}
# vim /etc/mackerel-agent/mackerel-agent.conf

以下の記載を追記します。

[plugin.metrics.multicore]
command = "mackerel-plugin-multicore"

mackerel-agentの再起動を実施

# sudo service mackerel-agent restart

ここまで終われば、時間経過によって各CPU使用率がMackerel上のグラフにカスタムメトリックとして追加されます。

最後に

今回、CPU使用率の表記が違うことでそれぞれのメトリック取得方法が異なる点を書きましたが、
こういったメトリックの取得方法の違いが見えることでメトリック自体の見え方がも変わると思いました。

こういった点は非常に興味深い分野なので引き続き調査を進めていきたいと思いました。