採用情報

お問い合わせ

BLOG

Zabbix テック・ラウンジ

2018 年 05 月 10 日

Housekeeperによるデータ削除を実行するRuntime Controlのオプション

今回は Runtime Control 機能のオプションの中から Housekeeper によりデータの削除を実行する機能について詳しく解説します。

はじめに

以前に書いた記事では Runtime Control 機能について解説を行いました。

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 プロセスの処理を見て行きます。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 時間分のデータが削除されることになります。

関連情報

注意事項

  • 本ドキュメントの内容は、予告なしに変更される場合があります。
  • 本ドキュメントは、限られた評価環境における検証結果をもとに作成しており、全ての環境での動作を保証するものではありません。
  • 本ドキュメントの内容に基づき、導入、設定、運用を行なったことにより損害が生じた場合でも、当社はその損害についての責任を負いません。あくまでお客さまのご判断にてご使用ください。
CentOS 7 延長サポートサービス
デジタルトランスフォーメーションのための電子認証基盤 iTrust
SSL/TLS サーバー証明書 SureServer Prime