avg関数について

宜しくお願いします!

以下のトリガーで使用されているavg関数について教えてください。
system.cpu.loadキーで60秒間隔でロードアベレージ(1分平均)を取得する「Processor load (1 min average per core)」というアイテムがあります。

以下のトリガーは、アイテムが取得した値を使って、過去5分間の平均値で比較演算するのでしょうか?
トリガーは、アイテムの取得周期と同じタイミングで毎分行われる認識です。よって、毎分、アイテムを取得した後で、その値をいれた過去のアイテム値の4回分の
平均を元に判断するという認識でよろしいでしょうか?

system.cpu.load[percpu,avg1].avg(5m)}>6

その場合、デフォルトにある「Processor load (5 min average per core)」というアイテムが取得する値のlast(0)とを比較するトリガーと何が異なるでしょうか?

以上、宜しくお願い致します。

コメント表示オプション

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

hozumiさん


トリガーは、アイテムの取得周期と同じタイミングで毎分行われる認識です。

アイテムとトリガーは別なタイマーでやっているはです。
なのでアイテム取得するタイミングとトリガーの検知タイミングは別ですね。

ユーザー hozumi の写真

KAZ さん

ありがとうございます。
タイマーが別なのですね。

どっちを使うべきかは難しいですね。

ユーザー KAZ の写真

hozumiさん


どっちを使うべきかは難しいですね。

微妙に理解いただけてないようですね…A(^^;

アイテムは更新間隔で情報を収集してDBに格納します。

トリガーは格納されたDBの値を条件に見合う時間分取得して、判定します。

なので、両方とも使うんですが…
尚、avg等は指定が無い時はデフォルトの時間になります。

ユーザー hozumi の写真

KAZ さん

コメントありがとうございます。
よく理解していませんでした。

アイテムはアイテム更新時間で値をDBに格納。
トリガーは条件分DBの値を取得して判断。

ということは、①と②の以下のトリガーは同じ結果ですか?
また、トリガーが実行される時間は、アイテム更新時と同じですか?

①アイテムの更新時間が1分の
system.cpu.load[percpu,avg1].avg(5m)}>6

②アイテムの更新時間が5分の
system.cpu.load[percpu,avg5].last(0)>6

①では、毎分OS上の1分間のロードアベレージ値を取得し、5分間「5回分?」の結果をDBから取得しその平均値が6以上だったらトリガー。
②では、5分毎に、OS上の5分間のロードアベレージ値を取得し、この最新の値が6以上だったらトリガー。
トリガーは、アイテム実行時に毎回判断実行されているイメージでした。

という認識です、よろしくお願いいたします。

ユーザー KAZ の写真

hozumiさん


ということは、①と②の以下のトリガーは同じ結果ですか?

前提として「アイテムとトリガーのタイマーは別でタイミングも別」です。
「1分平均の5分間」と「5分平均」の値を比べるから同じかと言うことでしょうか?
近しいですが同じにならないかもしれません。


また、トリガーが実行される時間は、アイテム更新時と同じですか?

アイテムとトリガーは独立した別の処理と考えてください。
なので、アイテム更新時にトリガーが動くと言うような処理にはなってません。


トリガーは、アイテム実行時に毎回判断実行されているイメージでした。

上記の説明通り別です。

ユーザー hozumi の写真

KAZ さん

コメントありがとうございます。

>アイテムとトリガーは独立した別の処理と考えてください。

こちらですが、例えばlast(0)>6の条件式で最新の値が6以上の場合の検知タイミングの最長は、

アイテムの更新時間(取得間隔) に 「トリガーが実行されるまでのタイマー時間」がプラスされるということですか?

例えば、2分間隔にアイテムを取得している場合、異常があってから最長2分後に最新のデータとして異常値を取得して、
トリガーはさらに発動時間まで待ってからDBから最新のデータを抽出して判断しトリガーするという流れでしょうか?

マニュアルのトリガー部分を再度読み返したのですが、具体的にトリガーの実行タイミングの記載を確認できませんでした。
どこで設定されるのでしょうか?

よろしくお願い致します。

ユーザー KAZ の写真

hozumiさん


アイテムの更新時間(取得間隔) に 「トリガーが実行されるまでのタイマー時間」がプラスされるということですか?

えーっと、何度も書きますがアイテムの更新時間はトリガーに関連しません。
何と説明すればいいのか…A(^^;
取り合えず、Zabbix2.2.2のソースベースで説明します。

アイテムの処理は下記の流れになります。
zabbix-2.2.2\src\zabbix_server\poller\poller.cのmain_poller_loop関数から動きます。
Zabbixサーバ起動後、アイテム取得処理(get_values関数)を延々と動かします。
get_values関数を呼び出す周期はcalculate_sleeptime関数で計算されます。

トリガーの処理は下記の流れになります。
zabbix-2.2.2\src\zabbix_server\timer\timer.cのmain_timer_loop関数から動きます。
Zabbixサーバ起動してから30秒(定数:TIMER_DELAY)の後からprocess_time_functions関数~process_triggers関数と呼び出されてトリガーの条件チェックがされます。
process_triggers関数が呼び出される周期は約30秒です。

process_triggers関数が呼び出される間隔(sleeptime)の求め方(TIMER_DELAYは30)

now = time(NULL);
nextcheck = now + TIMER_DELAY - (now % TIMER_DELAY);
sleeptime = nextcheck - now;

上記の通り、アイテムとトリガーは「別プロセス」です。
別処理ということが分かると思います。

トリガーは約30秒周期にチェックが行われるはずです。
avg等はトリガーが実行された時間から過去にさかのぼった期間を取得したデータから取り出してチェックします。
lastは格納されたデータの一番新しい値になります。

蛇足ですが、アイテムとトリガーは別処理ですが、トリガとイベント(アクション)は同一処理なので、トリガー検知でアクションが即時実行できます。