Windows 10で時刻同期を完璧にする方法 お前らのやり方は間違っている

Windows 10の時刻同期の設定方法として紹介されているものは、すべて間違っている。正しい方法であれば数ミリ秒レベルの誤差に収まるのに、それとは程遠い方法しか紹介されていない。

Windowsには比較的まともなNTPクライアントが実装されている。NTPクライアントに普通に仕事をさせるだけで、最悪でも数ミリ秒の精度は出せる。

最初にするのは、NTPクライアントが動き続けるようにする設定である。何も設定しないと、一回の時刻合わせのためにときどき動くだけで、NTP本来の継続的な時刻調整が行われない。

管理者として起動したコマンドプロンプトで以下のように入力すると、IPアドレスが付与されている間はNTPクライアントが動き続ける。

sc triggerinfo w32time start/networkon stop/networkoff

この設定で「サービス」の「Windows Time」が「手動 (トリガー開始)」になる。

タスクスケジューラーでTime SynchronizationのSynchronize Timeを無効にすることを勧める人もいるが、無視していい。それが必要なのは「自動 (遅延開始)」の場合だけだ。

NTPサーバーのホスト名の設定については、レジストリエディタで

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Parameters

のNtpServerに ntp.nict.jp,0x8 と書き込む。すでにntp.nict.jpに設定している皆さんも最後が9なので8に直す。

W32Time\TimeProviders\NtpClientSpecialPollInterval を書き換えることを勧める人もいるが無視していい。それが必要なのは末尾が9の場合だけだ。8なら同期間隔は自動調整される。

あとはNTPのSlewモードの調節速度をまともにするために、

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\W32Time\Config

のUpdateIntervalを100 (0x64)にPhaseCorrectRateを7に設定する。

これで完璧。

NTPサーバーの負荷 2020/03/15 11:15追記

NTPサーバーに問い合わせる間隔は1024秒~32768秒の範囲で自動的に調節される。この秒数はレジストリのMinPollInterval、MaxPollIntervalで調節できる。値は2^nで設定する。

ntp.nict.jpは一時間平均で20回を超えないようにすることを求めており、デフォルトの設定はこれを満たしている。

 時刻が大きくずれる場合 2020/03/15 12:10追記

時刻のずれは通常はゆるやかに修正されるが(slewモード)、1秒以上ずれている場合は直ちに修正される(stepモード)。ブート時やスリープ復帰時に大きく時刻がずれる場合は直ちに修正される。

slewモードとstepモードの閾値は、おおむねMaxAllowedPhaseOffsetで調節できる。正確な条件はWindows Time サービス - Slew モードと Step モード - | Microsoft Docsを参照してほしい。