chrony の時刻同期を監視

こんにちは。サイオステクノロジー OSS サポート担当何敏欽です。

NTP という仕組みは、1 秒以下の正確性が達成でき、ms、us 単位でのずれを識別して時刻調整をします。インターネット上では、数十ミリ秒の正確性の維持は普通のことです。そのため、大幅な時刻のずれが発生すること自体があまりないので、時刻同期の監視は重要視されていません。

でも、絶対に大幅な時刻のずれが発生しないとは言い切れません。例えば障害等で長時間電源が切れた状態から OS を起動するケースが挙げられます。IT では正確な時間の維持が重要であり、もし製品のログのタイムスダンプが実際の時刻と一致せず、障害などが発生した時に根本的な原因を特定するのが難しくなります。今回は chrony の時刻同期の監視方法をご紹介します。

知識として

  • chrony は、ntpd とは異なる NTP プロトコルの実装で、システムクロックをより迅速に調整することが可能です。
  • Chrony は、ネットワークアクセスが可能な場合、 NTP プロトコルを使用して外部の NTP サーバと時刻同期をします。 また、ネットワークアクセスが不可な (外部の NTP サーバの照会が可能でない) 場合は、 誤差ファイルに設定した誤差の平均値を計算してシステムクロックの設定を行ないます。
  • CentOS6/RHEL6 まではシステムのシャットダウンまたは再起動時に自動的に hwclock コマンドが実行され、ハードウェアから現在の時刻を取得し、システムクロックに設定します。CentOS7/RHEL7 以降はシステムのシャットダウンまたは再起動のタイミングに hwclock の実行は廃止され、カーネルは 11 分ごとにハードウェアクロックをシステムクロックに自動的に同期します。
  • chronyd のデフォルトでは「makestep 1.0 3」が設定されており、chrony が起動してから 1.0 秒以上のずれが 3回続いた場合に step モードで同期します。 デフォルト設定の chronyd は一度に時刻を大きく変化するような同期をさせないため、実行中のプログラムに影響を与えることはありません。特定の状況で makestep オプションを使用すると、chronyd は slew の代わりにシステム時間を一度に大きく変更します。
  • step モードのままにしておくメリットとしては、ネットワークの状態が悪いなどの原因で 128ms 以上の時刻ずれが生じた場合に 1回で時刻を合わせることができます。ただし、過去時刻へ戻る事象は発生する可能性があるデメリットがあります。slew モードは決して時刻を過去に戻りませんが、slew モードのデメリットとしては、時刻ずれを徐々に合わせるため上位サーバと時刻が同期するまでに時間を要し、時刻がずれている状態が長い間続くことが懸念点としてあげられます。

時刻同期の監視方法

方法1. cron で定期的に chronyc sources コマンドを実行し、実行結果を監視します。

下記のように /etc/crontab に下記の設定を追加します。なお、こちらの例は、4時間毎に chronyc sources を実行し、実行結果を /home/chronyc.log に出力させる例になります。

-------
0 */4 * * * root chronyc sources >> /home/chronyc.log
-------

正常に同期ができている場合に chronyc sources コマンドの出力を説明します。これを基に時刻の同期を監視してください。

例えば、chronyc sources コマンドの出力は下記とします。注目すべきは S の値、Poll の値、Reach の値、Last sample の値です。

# chronyc sources
210 Number of sources = 1
MS Name/IP address   Stratum Poll Reach LastRx Last sample
=======================================================================
^+ NTPサーバA           4    10   377   639  +521us[ +428us] +/-   25ms
^* NTPサーバB           4    10   377   384  +225us[ +129us] +/-   14ms
^- NTPサーバC           4    10   377   184  +164us[ +164us] +/-   77ms
    • S の値

NTP サーバ名の先頭に「*」が表示されていれば、正常に同期が行われます。「*」は chronyd が現在同期しているソースを示します。

    • Poll の値

NTPサーバへのポーリング間隔は、デフォルトでは 6 (64秒) であり、同期状態が安定していると判断された場合にはポーリング間隔が倍加されて、最大で 10 (1024秒) となります。

    • Reach の値

NTP サーバへの接続を試みた最後の 8 回分の結果を 8 進数で表示しています。8 ビットのビット列で結果を保持しており、サーバ接続できた場合はビットが立ちます。したがって全部成功した場合は、377 と表示されます。

    • Last sample の値

Last sample の値は NTP サーバとの時刻のずれを確認できます。”+225us[+129us] +/- 14ms” が表示された場合、225us は前回測定時の時刻のずれを表し、129us は前回測定後に slew で調整したもので、実際に測定されたオフセットを表し、14ms は測定における誤差の範囲を示します。

方法2. /var/log/messages に時刻ずれが発生した際に出力されるキーワードや文字列を監視します。

こちらで検証して確認しましたところ、監視するキーワードや文字列は Backward time、Forward time、Can’t synchronise、no selectable が挙げられます。

NTP サーバと NTP クライアント間に時刻ずれが発生した場合、/var/log/messages に下記のようなメッセージが出力されます。

#時刻は NTP サーバより遅れている場合に下記のメッセージが出力
Backward time jump detected!
Can't synchronise: no selectable sources
#時刻は NTP サーバより進んでいる場合に下記のメッセージが出力
Forward time jump detected! 
Can't synchronise: no selectable sources 

なお、同期ができた場合に下記のようなメッセージが出力されます。

#1s 程のずれから同期できた場合に下記のメッセージが出力
System clock wrong by 1.000149 seconds, adjustment started

ログファイルの監視対象は /var/log/messages にしていますが、それは chrony におけるデフォルトは syslog にログメッセージを送信し、その内容は /var/log/messages へ出力されるためです。/etc/chrony.conf に別途 log ディレクティブを設定することで、設定したパラメータに対応するログファイルが出力されます。各パラメータと出力されるファイル名の対応は以下の通りです。

    • measurements

生の NTP 測定と関連情報を /var/log/chrony/measurements.log と呼ばれるファイルにログ記録します。

    • statistics

回帰処理についての情報を /var/log/chrony/statistics.log と呼ばれるファイルにログ記録します。

    • tracking

システムが進むまたは遅れるレートの予測に対する変更、およびなされたスルーを /var/log/chrony/tracking.log と呼ばれるファイルにログ記録します。

    • rtc

システムのリアルタイムクロックについての情報を /var/log/chrony/rtc.log と呼ばれるファイルにログ記録します。

    • refclocks

生およびフィルター処理された参照クロックの測定を /var/log/chrony/refclocks.log と呼ばれるファイルにログ記録します。

    • tempcomp

温度測定とシステムレートの補正を /var/log/chrony/tempcomp.log と呼ばれるファイルにログ記録します。

上記の log ディレクティブの設定を行う場合であれば、該当するログファイルを監視対象とすることも考えられます。

以上で chrony の時刻同期の監視方法ついて説明しました。

ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

4人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です