Heartbeat通信

SMFv2では、SAの死活監視のためにHeartbeatという仕組みを用いている。 SA が Heartbeat サーバに対して定期的に UDP パケットを送信することで SA の死活状況をサーバ側で把握することができる。

また、SA が持つ統計情報をパケットに含めることで、サーバ側にて CPU 利用率、メモリ使用率、トラフィック情報などを蓄積してグラフ表示することも可能となっている。

Heartbeat 送信機能は、古いバージョンの libarms には含まれておらず、SA 自身で個別に実装する必要があったが、libarms Ver5.00 以降では Heartbeat 送信機能が統合され、SA 自身での実装は不要となった。このセクションでは Heartbeat 送信に関する仕様と注意点について解説する。

Heartbeat 送信を行うための準備

libarms による Heartbeat 送信機能を利用するためには、Heartbeat 情報収集コールバック関数を登録する必要がある。具体的には、 arms_event_loop() 呼び出し時、コールバック関数テーブルに arms_hb_store_statistics_cb_t を指定しておく必要がある。( arms_callback_tbl_t 参照)

Heartbeat 送信の開始

libarms によるコンフィグ取得が完了し、SA が PUSH 待ち状態に移行した直後から Heartbeat の送信が開始される。

具体的には、 arms_event_loop() をアプリケーションが呼び出すと、ARMS プロトコルの push-confirmation メッセージが送受信され、これにより PUSH 可能であることが確認されると PUSH_WAIT 状態に移行し、その直後に下記の処理が連続で実行される。

  1. arms_hb_store_statistics_cb_t() コールバック関数が呼ばれる。 統計情報を Heartbeat サーバに送信する場合は、ここで arms_hb_set_* 関数を用いて値をセットすること。 統計情報を送信しない場合は、コールバック関数内で特に何もしなくても構わない。
  2. コールバック関数から return すると libarms は Heartbeat パケットを送信する。

この 1. および 2. の処理は、予めRSから指定された時間で定期的に実行される。コールバック関数等による処理時間は差し引かれ、間隔が一定になるよう処理される。ただし、RSから取得した送信間隔よりも処理時間が長い場合の動作は保証されない。

Heartbeat 送信の停止

Heartbeat 送信は、libarms が PUSH-WAIT 状態で無くなるときに停止される。 具体的には、

  • arms_app_event_cb_t() から ARMS_EPUSH が通知され、push-confirmation を再実行する直前
    • 再確認が完了し、PUSH-WAIT 状態になるとそのタイミングから再開する
  • トンネル接続がすべて切断され、いずれもリトライ上限に達したとき
  • RSからの再起動もしくはコンフィグ再取得指示により PUSH 待ち受けを終了するとき
  • 設定変更が実行され、PUSH 再確認を実行する直前
    • 再確認が完了し、PUSH-WAIT 状態になるとそのタイミングから再開する

のいずれかとなる。

Heartbeat 送信の一時停止

何らかの理由で Heartbeat 送信を一時的に停止したい場合、 arms_hb_stop() を利用することができる。再開する場合は arms_hb_start() を利用する。 これらは特段の理由が無ければ呼び出す必要は無い。

また、これらの API で Heartbeat 送信を停止させても、 arms_hb_store_statistics_cb_t() コールバック関数は呼ばれ続ける。

目次

前のトピックへ

Push動作における通信

次のトピックへ

SA実装

リンク