Windows Time サービス - Slew モードと Step モード -

皆様、こんにちは。Windows プラットフォームサポート担当の藤田です。
今回は、時刻の合わせ方 - Step モードと Slew モード - について、ご紹介したいと思います。

1. おさらい ~ step モードと slew モードについて~

既にご存知の方も多いと思いますが、まずは Step モードと Slew モードについて、おさらいしたいと思います。

===============
Slew モードの時刻の合わせ方
===============
データベースのトランザクション管理などに影響を与えないために、NTP サーバーと NTP クライアントの時刻差を徐々に縮めることによって、時刻が戻ることを防ぎながら時刻を修正します。
具体的には、NTP クライアントの方が時刻が遅れている場合には、例として、実際には 0.9 秒しか経っていないにもかかわらず、1 秒時刻を進めることにより、NTP サーバーと NTP クライアントの時刻差を徐々に縮めます。
逆に、NTP クライアントの方が時刻が進んでいる場合には、例として、実際には 1.1 秒経っているにもかかわらず、1 秒だけ時刻を進めることにより、NTP サーバーと NTP クライアントの時刻差を徐々に縮めます。

===============
Step モードの時刻の合わせ方
===============
Slew モードのように徐々に時間差を縮めるのではなく、目標の時刻に瞬時に変更します。
NTP サーバーよりも NTP クライアントの方が時刻が進んでいる場合、NTP クライアントの時刻は過去に戻ります。

2. どちらのモードが使用されるか?

では、本題にはいります。
Slew モードと Step モード、どのようにして、どちらの合わせ方が適用されるのか、ご存じでしょうか ?

Slew モードで時刻同期をする一般的な条件は下記の通りです。

次の 2 つの条件をすべて満たす場合、Slew モードで時刻同期を実施することができます。
逆に、2 つの条件のいずれかを満たしていない場合は、Step モードで時刻同期を実施します。

条件 1.
AbsoluteValueOfCurrentTimeOffset < MaxAllowedPhaseOffset の不等式が満たされること。

条件 2.
AbsoluteValueOfCurrentTimeOffset/PhaseCorrectRate/UpdateInterval < System Clock Rate/2 の不等式が満たされること。
上記の条件式のそれぞれの値の意味を、下記にご説明します。■ AbsoluteValueOfCurrentTimeOffsetこの値は、NTP Client が NTP Server に対して Polling した際の NTP Client と NTP Server の時刻の差です。

■ MaxAllowedPhaseOffset
NTP Server から受信した時刻と NTP Client の時刻差が何秒までであれば、Slew モードで時刻同期を行うことが許容されるかの設定値です。
上記の条件 1 の判定に置いて使用されます。この値は、下記のレジストリで設定されています。

レジストリ キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
値の名前: MaxAllowedPhaseOffset

■ PhaseCorrectRate、UpdateInterval
NTP Server から受け取った時刻サンプルをもとに、どのくらいの間隔で、どのくらいの速度で時刻をあわせていくかの傾きを示す設定値です。
これらの値は、下記のレジストリで設定されています。

レジストリ キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config
値の名前: PhaseCorrectRate
値の名前: UpdateInterval

■ System Clock Rate
システムのクロック レートを表す値です。通常であれば、シングル プロセッサーでは約 10ms、マルチ プロセッサーでは約 15 ms となります。

3. サーバーの役割による違い

上述の通り、Slew モードと Step モードのいずれが使用されるかは、NTP Client と NTP Server の時刻差によって、動的に決定されます。
また、ドメイン コントローラーか、ドメインのメンバー サーバーか、ワークグループ環境かによって、上記の条件式で使用される各パラメーターの既定値が異なるため、Slew モードで時刻同期できる 「NTP Server との時刻のずれ」 の値も異なります。

今回は、Windows Server 2008 R2 を題材にして、実際に既定の構成では、どれくらいの時刻差であれば Slew モードになるのかを確認してみます。

【ドメイン コントローラーの場合】
既定の状態において関連するレジストリとその値は次の通りとなっております。
MaxAllowedPhaseOffset : 300
PhaseCorrectRate : 7
UpdateInterval : 100

実際に条件式にあてはめて、計算してみましょう。

条件 1.
AbsoluteValueOfCurrentTimeOffset < 300 秒

条件 2.
- マルチ プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 7 ÷ 100 < 0.015 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 5.25 秒

- シングル プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 7 ÷ 100 < 0.010 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 3.5 秒

つまり、NTP Server との時刻差が 5.25 秒未満、もしくは 3.5 秒未満の場合は、Slew モードで時刻同期が行われる結果となります。

【ドメイン メンバー サーバーの場合】
既定の状態において関連するレジストリとその値は次の通りとなっております。
MaxAllowedPhaseOffset : 300
PhaseCorrectRate : 1
UpdateInterval : 30000

実際に条件に合うかどうか、計算してみましょう。

条件 1.
AbsoluteValueOfCurrentTimeOffset < 300 秒

条件 2.
- マルチ プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 30000 < 0.015 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 225 秒

- シングル プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 30000 < 0.010 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 150 秒

つまり、NTP Server との時刻差が 225 秒未満、もしくは 150 秒未満の場合は、Slew モードで時刻同期が行われる結果となります。

【ワークグループの場合】
既定の状態において関連するレジストリとその値は次の通りとなっております。
MaxAllowedPhaseOffset : 1
PhaseCorrectRate : 1
UpdateInterval : 360000

条件 1.
AbsoluteValueOfCurrentTimeOffset < 1 秒

条件 2.
- マルチ プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 360000 < 0.015 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 2700 秒

- シングル プロセッサーの場合
AbsoluteValueOfCurrentTimeOffset ÷ 1 ÷ 360000 < 0.010 ÷ 2
AbsoluteValueOfCurrentTimeOffset < 1800 秒

つまり、NTP Server との時刻差が 1 秒未満の場合は、Slew モードで時刻同期が行われる結果となります。
えっ!?!? 1 秒???
そうです、既定の状態ではワークグループ環境の場合は、NTP Client と NTP Server の時刻の差が 1秒以内でなければ、Slew モードで時刻同期することができません。。。

既定の状態だとStep モードになると考えたほうが良いですね。
では、どうしたら Slew モードで時刻同期することができるようになるのでしょうか ?

ワークグループ環境では条件 1 の方が強く働いて、Step モードが採用される結果となっています。このため、MaxAllowedPhaseOffset の値のデータを変更していただく必要がございます。
例えば、ドメイン コントローラーやメンバー サーバーのように 300 に設定変更していただくと、300 秒までの時刻差の場合は、Slew モードで時刻同期を行うように動作が変更されます。
パラメーターの調整を行いたい場合は、上述の各レジストリの値を変えて、Slew モードで時刻同期をする条件に当てはめ、任意の値をご設定いただくことができます。

しかし・・・NTP Server との時刻差がいつも同じくらいの間に収まっているとは限りません。NTP Server との時刻差がどのような値になったとしても、確実に Step モードで時刻同期させないための設定はどうしたらよいのでしょうか??

その方法は次回、ご紹介いたします!!

<今回の参考情報>
Windows Time サービスにおける時刻同期の仕組み
https://support.microsoft.com/kb/2722681/ja

対応している OS :

Windows Vista / Windows Server 2008

Windows 7 / Windows Server 2008 R2

Windows8 / Windows Server 2012 / Windows Server 2012 R2