はじめに
システムの時刻がばらばらに設定されていると、様々な不具合が生じてしまうため、正確に時刻を合わせておくことが重要です。
身近なところでは、電子メールが例に挙げられます。送信側の時刻が大幅に進んでいる場合、受信者は未来からメールが来たと思ってしまいます。逆に遅れている場合、受信者は過去からメールを受信したと思い、システムに遅延があると勘違いしてしまいます。
また、システム運用の場面では、不具合対応のためにログ解析を行う際に時刻がずれていると、どの操作で不具合が発生したかなどが不明瞭になり、原因追及が難しくなる可能性があります。
その他にも、例えば受発注システムで、受注/発注の時刻がずれていると、当然大きな問題になりかねません。
このように、システムにおいて時刻を合わせることは必須事項です。そこで使われるのがNTPサーバーです。
NTPサーバーとは
NTPサーバーとは、TCP/IPネットワークを通じてNTP(Network Time Protocol)通信プロトコルを使用し,サーバーとクライアント間で正確な時刻情報を取得・配信しているサーバーのことです。
NTPサーバーは、階層構造で管理されています。最上位の原子時計やGPS時計に対し、下位のNTPサーバーが同期を行い、複数のNTPサーバーが同一の時刻を保持することで成り立っています。
NTPクライアントはこのNTPサーバーと時刻同期を行うことになります。
図1.NTP階層
Windows Serverの時刻同期の仕様
それでは、Windows Serverで時刻同期をする際の仕様を確認しましょう。
時刻同期の処理には、瞬時に時刻同期を行うStepモードと、徐々に時刻同期を行うSlewモードの2種類があります。
Slewモードが用意されている理由は、時刻の変更が瞬時に変更されてしまうと、JOB実行の時間が過ぎてしまったり、データベースのトランザクション処理が狂ってしまうといった弊害がおきる可能性があるためです。
また、ドメインに参加、不参加により同期先のNTPサーバーTypeの違いや、デフォルトでの設定値(レジストリ値)に差異があります。
- ドメイン参加の場合:ADサーバーと時刻同期
- Workgroupの場合:指定したNTPサーバーと時刻同期
図2.時刻同期に関するレジストリ値(一部)
ドメインメンバーのType規定値、NT5DSを変更するような場合には、ドメインコントローラーとの時刻差が発生し、認証等に影響が出る可能性があるため、注意が必要です。
また、デフォルト値では、ドメインメンバーとWorkgroupに差異があるため、時刻同期の動作が異なることになり、システムによって問題になる可能性が考えられるので、個々に設計を行う必要性があります。
Slewモードで動作させるための計算方法
レジストリの値だけでは、Slewモードで動作させるための条件がわからないので、レジストリ値から計算し、条件を導き出す必要があります。
Windows Server 2016から 時刻同期の仕様が変更されており、Slewモードで動作させる際の計算方法も異なっていますので、注意が必要です。
以下にOSのバージョンによる差異を記載します。
Slewモードの条件式
- Windows Server 2012以前
- 条件1.
AbsoluteValueOfCurrentTimeOffset / (PhaseCorrectRate * UpdateInterval)<= System Clock Rate / 2 - 条件2.
AbsoluteValueOfCurrentTimeOffset <= MaxAllowedPhaseOffset
- 条件1.
- Windows Server 2016以降
- 条件1.
AbsoluteValueOfCurrentTimeOffset <= MaxAllowedPhaseOffset - 条件2.
AbsoluteValueOfCurrentTimeOffset ÷ (16 x PhaseCorrectRate x pollIntervalInSeconds)<= System Clock Rate/2
- 条件1.
注)System Clock Rate はシングルプロセッサーの場合:0.010 / マルチプロセッサーの場合:0.015 で固定となります。
それでは、実際にWindows Server 2016以降の計算式で値を入れて計算してみます。
計算例
Windows Server 2016 Workgroupサーバー(マルチプロセッサー)の既定値を想定して、計算例を記載します。
-
- MaxAllowedPhaseOffset:300
- PhaseCorrectRate:1
- pollIntervalInSeconds:2^6(MinPollInterval ) ~ 2^10(MaxPollInterval)
※なお、上記計算式における、pollIntervalInSeconds = ポーリング間隔は、MinPollInterval からMaxPollIntervalの間の変数となります。
そのためSlewモードとStepモードの判定条件においては、MinPollInterval 及び、MaxPollInterval の設定値によって揺らぎが発生します。
以下の計算例では、MinPollInterval(最小値)が利用されている場合と、MaxPollInterval(最大値)が、利用されている場合の2パターンで、記載します。
各条件式は以下の通り
- 条件1.
- AbsoluteValueOfCurrentTimeOffset <= MaxAllowedPhaseOffset
- AbsoluteValueOfCurrentTimeOffset <= 300 秒
- 条件2.
*pollIntervalInSeconds = 2^6 の場合
-
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x PhaseCorrectRate x pollIntervalInSeconds) <= System Clock Rate/2
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x 1 x2^6) <= 0.015/2
- AbsoluteValueOfCurrentTimeOffset <= 7.68
*pollIntervalInSeconds = 2^10 の場合
-
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x PhaseCorrectRate x pollIntervalInSeconds)<= System Clock Rate/2
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x 1 x2^10) <= 0.015/2
- AbsoluteValueOfCurrentTimeOffset <= 122.88
以上によりNTP サーバーとの時刻差が約 7 秒 ~ 122 秒以下の場合は、 Slew モードで時刻同期が行われます。
設定をSlewモードを10秒未満、10秒以上はStepモードで動作させるには以下の設定となります。
設定例:
-
- MaxAllowedPhaseOffset:10
- PhaseCorrectRate:1
- pollIntervalInSeconds:2^7(MinPollInterval ) ~ 2^7(MaxPollInterval)
上記設定値をベースに考えると条件は以下の通りとなります。
- 条件 1.
- AbsoluteValueOfCurrentTimeOffset <= MaxAllowedPhaseOffset
- AbsoluteValueOfCurrentTimeOffset <= 10 秒
- 条件 2.
* pollIntervalInSeconds = 2^7 の場合
-
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x PhaseCorrectRate x pollIntervalInSeconds) <= System Clock Rate/2
- AbsoluteValueOfCurrentTimeOffset ÷ (16 x 1 x2^7) <= 0.015/2
- AbsoluteValueOfCurrentTimeOffset <= 15.36
条件1及び2両方を満たす必要があるため、上記の場合には10秒未満はslew/10秒以上はstepという動作を実現可能です。
(pollIntervalInSecondsを2^6 とした場合 条件式2が7.68となり、約8秒以下となるため2^7に設定)
実際のStep,Slewモードにおける同期処理の確認
設定されている構成を確認します。
最終正常同期時刻が直近の日時として表示されていることを確認します。
NTPサーバーとの時刻差異を確認します。
手動で時刻を変更し、同期処理の動作を確認します。(Stepモード)
手動で時刻を変更し、同期処理の動作を確認します。(Slewモード)
時刻同期が完了したことが確認できます。
最後に
時刻同期は、初期に時刻を合わせていても、少しずつ時間がずれていくため、先に記載したような同期方法を設計し、設定することが重要です。
いずれにせよ、時刻同期はシステムにおいて重要であるため、設定することをお勧めします。
執筆者プロフィール

- IDC&セキュリティサービスグループ
-
以前から、変わった?新しい?技術に興味があり、いろいろと実践してきました。
キャパシタ付のDISKや、ハードウェア仮想化、高集積Storageなどなど、これからも面白そうなアーキテクチャーが出てくれば使えるものか試していきたいと考えています。
この執筆者の最新記事
ITコラム2022.07.25NTPによるWindowsの時刻同期の方法
AWS・クラウド2018.10.04Gridに参加してみよう