AWS(EC2)のCPU使用率の値が、Zabbixとコンソール(Cloudwatch)で乖離している

AWS上のEC2(Amazon Linux / Windows Server等)インスタンスを、Zabbixで監視しています。
その中で「CPU使用率」を、以下の式で取得しています。
・system.cpu.util[,user,avg5]

ところが、AWSのコンソール上のモニタ(Cloudwatch)で確認できるCPU使用率と、数値にかなり乖離があります。
・Zabbix:0~2%で推移(瞬間的に90%まで上昇することもある)
・AWSコンソール:20~60%で推移

こちらの要因について教えていただきたいです。

※おそらく、AWSコンソール側はインスタンスに割り当てられたCPUの中での使用率を表しており、監視すべきはこちらの値だと思っています。
 ただ、Zabbixで今取得している値がいったい何なのかがよく分かりません。。

コメント表示オプション

お好みのコメント表示方法を選び「設定の保存」をクリックすると変更が反映されます。
ユーザー fripper の写真

Cloudwatch にて取得されるCPU使用率のメトリクス(CPUUtilization)で得られる値は
EC2 によってインスタンスへ割当されたCPU能力のうち、当該インスタンスがどの程度を
利用・消費しているか、という割合の指標だと思います
標準だと5分間、詳細モニタリングが有効だと1分間の値(おそらく平均値)だと考えます
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/viewing_metrics...

Zabbix の system.cpu.util[,user,avg5]の場合は
システム全体のCPU消費のうち、user プロセスに割当された時間の5分平均となります
https://www.zabbix.com/documentation/3.0/manual/config/items/itemtypes/z...
第2引数のtype 項目にて「user」を設定されているので、ユーザプロセスによる演算消費のみが
計上されている状況です
system/iowait や steal 等、他の要因によって消費されている部分が得られておらず、
EC2側にてトータルの使用率として計上されている「合算値」と一致しないのだと思います

ちなみに、system.cpu.util[]にて取得できる値をさまざまに合算しても、
EC2のメトリクス値と完全には一致しません
これは仮想マシンのハードウェア側レベルと、仮想マシン内のOSレベルとの差異もあるので
ある程度の誤差は許容するほか無いかと思います

また、Windows用エージェントの場合には、第2引数には「system」のみしかサポートされておらず
「user」を指定した場合には、値は取得できていないのではないかと思います
Windowsの場合には、パフォーマンスカウンタを利用した取得等、他の方法も含め
検討されると良いかと思います

参考:
http://www.zabbix.jp/node/3625
https://www.zabbix.com/forum/showthread.php?p=53017

ユーザー hayap の写真

早速のご回答、ありがとうございました!大変助かりました。

「user」以外の状況を確認したところ、「nice」の消費が大きく、それを合算すると Cloudwatch に近い数値になり、合点がいきました。
(Zabbix の system.cpu.util[,user,avg5]はホストOS のCPU使用率という情報をどこかで握らされていたのですが、すっかり勘違いでした。。)

また、Windowsについてもご指摘いただき、ありがとうございました。

ユーザー hayap の写真

fripperさま

すみません、可能であればまたご教授いただきたいのですが、
パフォーマンスカウンタを利用して(["\Processor(_Total)\% Processor Time"])取得したところ、こちらもややCloudwatchとの値に開きがありました。

・Zabbix:0~1%で推移
・AWSコンソール:5~6%で推移

こちらも、Linuxと同様、Cloudwatch上では「Processor Time」以外の値も含んでいるということだと思うのですが、何の差によるものか特定できずにいます。
もしご存知でしたら教えていただけますでしょうか。

ユーザー TNK の写真

少しだけ補足させて頂きます。

CloudWatchで取得できないStealの値が取得できると、運悪く物理
的に同じサーバー上で他のVMが大量にCPUの負荷をかけていて処理
が遅くなった時に、CloudWatch側ではCPUに負荷がかかっていない
と見えるのですが、Zabbix側ではStealという仮想環境の切り替え
処理にCPUの能力が消費されていることが確認できたりします。

他にも、Zabbixであれば、iowaitなどを参照することで、ディスク
のI/Oによるボトルネックを発見しやすいでしょう。

大雑把な負荷の把握であれば、CloudWatchで十分かもしれませんが、
詳細なOSの状態の変化を把握するのであれば、Zabbixが有効だと私
は考えています。

何をしたいか、それぞれのツールで何ができるのか、それらが要件
を満たしているかを合わせてご検討ください。

ユーザー hayap の写真

補足ありがとうございました!

なるほど、一概にどちらが正しいというわけではなく、何をどう見たいのかをまず設計しないといけないということですね。。
勉強になります!

ユーザー fripper の写真

先の投稿にて「参考」として挙げたURLの投稿で、TNKさんが、パフォーマンスカウンタに関するMSの記事をリンクされています
 http://www.zabbix.jp/node/3625
 https://technet.microsoft.com/ja-jp/library/2008.08.pulse.aspx#id0120037

この記事において、数種類のプロセッサ関連カウンタが列挙されているようです
また、検索した限りですが、他にも様々なProcessor関連カウンタがあるようですので
こちらの状況より、AWS側の値に近い値が得られるかもしれません
¥Processor(_Total)¥% Processor Time
¥Processor(_Total)¥% Privileged Time
¥Processor(_Total)¥% User Time
¥Processor(_Total)¥Interrupts/sec

私自身、Windows・パフォーマンスカウンタ周りの監視を利用した経験が乏しく、詳しくないので
あまりお力になれず、申し訳ありません