BLOG
2018 年 05 月 10 日
Housekeeperによるデータ削除を実行するRuntime Controlのオプション
今回は Runtime Control 機能のオプションの中から Housekeeper によりデータの削除を実行する機能について詳しく解説します。
はじめに
以前に書いた記事では Runtime Control 機能について解説を行いました。
今回は Runtime Control 機能のオプションの中から Housekeeper によりデータの削除を実行する機能 ( 以下、本機能 ) を詳しく解説します。
本機能を実行すると、実行したタイミングで HouseKeeper によるデータの削除を実行することができます。
使い方
Zabbix サービスを起動するコマンド (zabbix_server,zabbix_proxy) に "-R" を付与し、その引数としてオプションを指定する文字列 (housekeeper_execute) を渡し実行します。
実行例 )
# zabbix_server -R housekeeper_execute
解説
本機能は他の Runtime Control のオプションと同様に実装されています。
[ 参照 : Runtime Control 機能の解説 ]
コマンドを実行すると既に起動している Zabbix サービスの親プロセスに対して、シグナルと引数のデータを送信します。シグナルを受け取った親プロセスは HouseKeeper プロセスに対してシグナルを送ります。
更に HouseKeeper プロセスのシグナルハンドラが親プロセスからシグナルを受け取ると最終的には下記の関数をコールします。
src/zabbix_server/housekeeper/housekeeper.c
154 void zbx_housekeeper_sigusr_handler(int flags) 155 { 156 if (ZBX_RTC_HOUSEKEEPER_EXECUTE == ZBX_RTC_GET_MSG(flags)) 157 { 158 if (0 < zbx_sleep_get_remainder()) 159 { 160 zabbix_log(LOG_LEVEL_WARNING, "forced execution of the housekeeper"); 161 zbx_wakeup(); 162 } 163 else 164 zabbix_log(LOG_LEVEL_WARNING, "housekeeping procedure is already in progress"); 165 } 166 }
この処理では、Housekeeper プロセスがスリープする時間を設定するためのカウンタの値を取得します。
この値が 0 より大きい場合はプロセスがスリープしてしていることを意味します。
この値を 0 に書き換えることにより、スリープを中断してデータ削除処理に遷移させます。
また、この値が 0 である場合は何もせずに処理を戻します。0 であることは、Housekeeper プロセスがデータ削除処理の実行中か起動直後であることを意味します。
つまり、プロセスがそれらの状態にある場合に、Housekeeper によるデータ削除が実行されないようにするためのミューテックスロックとしての機能が実装されています。
HouseKeeper プロセスの処理を見て行きます。HouseKeeper プロセスは大まかには起動した後、スリープとデータの削除を延々と繰り返し行います。
src/zabbix_server/housekeeper/housekeeper.c
804 ZBX_THREAD_ENTRY(housekeeper_thread, args) 805 { ... 832 for (;;) 833 { 834 sec = zbx_time(); 835 836 if (0 == CONFIG_HOUSEKEEPING_FREQUENCY) 837 zbx_sleep_forever(); 838 else 839 zbx_sleep_loop(sleeptime); ... 843 time_slept = zbx_time() - sec; 844 845 hk_period = get_housekeeping_period(time_slept); ... 858 d_history_and_trends = housekeeping_history_and_trends(now); ... 891 if (0 != CONFIG_HOUSEKEEPING_FREQUENCY) 892 sleeptime = CONFIG_HOUSEKEEPING_FREQUENCY * SEC_PER_HOUR; ... 897 } 898 }
スリープ処理はデータの削除処理の自動実行が無効である (HousekeepingFrequency が 0 である ) かにより分岐します。※HousekeepingFrequency(zabbix_server.conf)
スリープ処理を終了した後はデータの削除処理に遷移し、データの削除処理が終了すると、またスリープ処理に戻ります。
各々のスリープ処理の実装を見て行きます。
1. データの削除処理の自動実行が無効である場合
560 void zbx_sleep_forever(void) 561 { 562 sleep_remains = 1; ... 566 do 567 { 568 sleep(1); 569 } 570 while (0 != sleep_remains); ... 573 }
Housekeeper によるデータの削除処理の自動実行を無効に設定した場合でも、Housekeeper プロセスは起動され、1 秒スリープすること (sleep(1)) を延々と繰り返します。
この実装は、自動実行を無効している場合でも、本機能を使用できるようにするためのものです。
本機能の実行によりカウンタ (sleep_remains) が 0 にセットされると、sleep() を繰り返すループから抜けます。
これにより、データの削除処理に遷移します。
2. データの削除処理の自動実行が有効である場合
Housekeeper によるデータの削除処理の自動実行を無効に設定した場合でも、Housekeeper プロセスは起動され、1 秒スリープすること (sleep(1)) を延々と繰り返します。
この実装は、自動実行を無効している場合でも、本機能を使用できるようにするためのものです。
本機能の実行によりカウンタ (sleep_remains) が 0 にセットされると、sleep() を繰り返すループから抜けます。
これにより、データの削除処理に遷移します。
542 void zbx_sleep_loop(int sleeptime) 543 { ... 547 sleep_remains = sleeptime; ... 551 do 552 { 553 sleep(1); 554 } 555 while (0 < --sleep_remains); ... 558 }
カウンタ (sleep_remains) の分だけ、1 秒スリープすることを繰り返す実装となっています。
本機能の実行によりカウンタ (sleep_remines) が 0 にセットされると、スリープ処理を中断してデータを削除する処理に遷移します。
ところで、本機能を使用するとどの範囲のデータが削除されるのでしょうか ?
ヒストリ / トレンドデータについては、アイテムの保存期間より古いデータが存在した場合、最も古い時刻のデータから、[4 * "HouseKeeper がスリープした時間 "] 分が削除されます。
ただし、スリープした時間が 1 時間未満である場合は 4 時間 (4*1 時間 ) 分となります。
" スリープした時間 " にはスリープ処理が終わった時刻から、スリープ処理に入る直前の時刻を引いた時間が入ります。(l.843)
例えば、HousekeepingFrequency(zabbix_server.conf) に 12( 時間 ) を設定していたとしても、プロセスが 2 時間スリープした時点で本機能を実行した場合では、8 時間 (4*2 時間 ) 分のデータが削除されるこになります。
データを早く削除したい場合等の目的で、繰り返し (1 時間未満の間隔で ) 実行すれば、そのつど 4 時間分のデータが削除されることになります。
関連情報
注意事項
- 本ドキュメントの内容は、予告なしに変更される場合があります。
- 本ドキュメントは、限られた評価環境における検証結果をもとに作成しており、全ての環境での動作を保証するものではありません。
- 本ドキュメントの内容に基づき、導入、設定、運用を行なったことにより損害が生じた場合でも、当社はその損害についての責任を負いません。あくまでお客さまのご判断にてご使用ください。