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 - 投稿数: 1085
hozumiさん
トリガーは、アイテムの取得周期と同じタイミングで毎分行われる認識です。
アイテムとトリガーは別なタイマーでやっているはです。
なのでアイテム取得するタイミングとトリガーの検知タイミングは別ですね。
hozumi - 投稿数: 23
KAZ さん
ありがとうございます。
タイマーが別なのですね。
どっちを使うべきかは難しいですね。
KAZ - 投稿数: 1085
hozumiさん
どっちを使うべきかは難しいですね。
微妙に理解いただけてないようですね…A(^^;
アイテムは更新間隔で情報を収集してDBに格納します。
トリガーは格納されたDBの値を条件に見合う時間分取得して、判定します。
なので、両方とも使うんですが…
尚、avg等は指定が無い時はデフォルトの時間になります。
hozumi - 投稿数: 23
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 - 投稿数: 1085
hozumiさん
ということは、①と②の以下のトリガーは同じ結果ですか?
前提として「アイテムとトリガーのタイマーは別でタイミングも別」です。
「1分平均の5分間」と「5分平均」の値を比べるから同じかと言うことでしょうか?
近しいですが同じにならないかもしれません。
また、トリガーが実行される時間は、アイテム更新時と同じですか?
アイテムとトリガーは独立した別の処理と考えてください。
なので、アイテム更新時にトリガーが動くと言うような処理にはなってません。
トリガーは、アイテム実行時に毎回判断実行されているイメージでした。
上記の説明通り別です。
hozumi - 投稿数: 23
KAZ さん
コメントありがとうございます。
>アイテムとトリガーは独立した別の処理と考えてください。
こちらですが、例えばlast(0)>6の条件式で最新の値が6以上の場合の検知タイミングの最長は、
アイテムの更新時間(取得間隔) に 「トリガーが実行されるまでのタイマー時間」がプラスされるということですか?
例えば、2分間隔にアイテムを取得している場合、異常があってから最長2分後に最新のデータとして異常値を取得して、
トリガーはさらに発動時間まで待ってからDBから最新のデータを抽出して判断しトリガーするという流れでしょうか?
マニュアルのトリガー部分を再度読み返したのですが、具体的にトリガーの実行タイミングの記載を確認できませんでした。
どこで設定されるのでしょうか?
よろしくお願い致します。
KAZ - 投稿数: 1085
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は格納されたデータの一番新しい値になります。
蛇足ですが、アイテムとトリガーは別処理ですが、トリガとイベント(アクション)は同一処理なので、トリガー検知でアクションが即時実行できます。