グラフの平均の計算方法について

お世話になっております。

OS : linux CentOS 6.2
Zabbix:2.0.3
Zabbix Agent:2.0.3-1.el6.x86_64

zabbix DB(mysql) で以下のコマンドを使用して CPU 使用率のデータを表示させたのですが、
監視データのグラフと比較した際、平均だけ値に差異がありました。
zabbix DB と 監視データのグラフでは平均の計算方法に違いがあるのでしょうか。
もし違いがある場合は、それぞれの計算方法をご教授いただけると助かります。

◆ zabbix DB の値

mysql> select from_unixtime(clock),value_min,value_avg,value_max from trends_uint where itemid=(アイテムID);

結果
+----------------------+-----------+-----------+-----------+
| from_unixtime(clock) | value_min | value_avg | value_max |
+----------------------+-----------+-----------+-----------+
-----省略-----
| 2014-04-16 08:00:00 | 1 | 1 | 10 |

◆ zabbix 監視データ>グラフの値

CPU RAW-new(1h)

最新値 最少 平均 最大
cpu-rawUser-new 0% 1% 4.25% 10%

コメント表示オプション

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

こんなデータが有ったとします。
mysql> select from_unixtime(clock),num, value_min,value_avg,value_max from trends_uint where itemid=xxxxxx;
+----------------------+-----+-----------+-----------+-----------+
| from_unixtime(clock) | num | value_min | value_avg | value_max |
+----------------------+-----+-----------+-----------+-----------+
| 2014-04-08 11:00:00  |   8 |        80 |       329 |       840 |
| 2014-04-08 12:00:00  |  60 |        88 |       659 |      5272 |
+----------------------+-----+-----------+-----------+-----------+
2 rows in set (0.00 sec)

グラフで期間を2014-04-08 11:30〜12:30にしていすると…
最少:88
平均:659
最大:5272
です。

グラフで期間を2014-04-08 10:30〜12:30にしていすると…
最少:80
平均:494
最大:5272
です。

最小と最大は指定期間に該当するレコードの中でvalue_minの最小とvalue_maxの最大となります。
平均は、指定期間に該当するレコードのvalue_avgを全部足して、該当レコード数で割ります。
ユーザー ひろし の写真

グラフの期間は2014-04-16 08:00〜09:00にしています。
ためしにグラフの期間を2014-04-16 07:30〜08:30にすると以下のようになります。

最新値 最少 平均 最大
cpu-rawUser-new 0% 0% 2.02% 5%

zabbix DB の 2014-04-16 08:00:00 の列に表示された 平均 1 というのは
何時から何時の平均なのでしょうか?

ユーザー KAZ の写真
ひろしさん

zabbix DB の 2014-04-16 08:00:00 の列に表示された 平均 1 というのは 何時から何時の平均なのでしょうか?
ソース読みきれてませんが…
zabbix-2.0.0/src/libs/zbxdbcache/dbcache.cのDCadd_trend関数で
	hour = history->clock - history->clock % SEC_PER_HOUR;

	trend = DCget_trend(history->itemid);

	if (trend->num > 0 && (trend->clock != hour || trend->value_type != history->value_type))
		DCflush_trend(trend, trends, trends_alloc, trends_num);

	trend->value_type = history->value_type;
	trend->clock = hour;
とあるので、2014-04-16 08:00:00 〜 2014-04-16 08:59:59のhistory_uint平均と思われます。
この関数やDCflush_trends関数にtrends_uintの各項目の値の算出が載ってます。


■補足 2014-04-16 16:34追加
最初に回答したのは、グラフ表示時にtrends_uintの値を更に平均化するロジックです。

zabbix-2.0.0/frontends/php/include/func.inc.php の下記が該当します。
bcadd($sum, $value);で指定期間の値を全部加算して、bcdiv($sum, count($values));で回数で割っています。

/************* ZBX MISC *************/
function zbx_avg($values) {
	zbx_value2array($values);
	$sum = 0;
	foreach ($values as $value) {
		$sum = bcadd($sum, $value);
	}
	return bcdiv($sum, count($values));
}
ユーザー ひろし の写真

早急なご回答ありがとうございます。

history と trends で平均に差異があるのはバグのようです。

参考URL:
https://support.zabbix.com/browse/ZBX-3643
https://www.zabbix.com/forum/showthread.php?t=41535

ユーザー KAZ の写真

ひろしさん

ご指摘ありがとうございます。
小数点が切り落とされて、監視間隔が短いほど誤差が大きくなるようですね。
2.1.0でFixedとなってますので、2.2からは大丈夫なようですね。A(^^;