はじめに
NTPは時刻同期を行うためのプロトコルです.
PCの時刻は基本的にNTPで同期していれば正確,と思っていたのですが,特にwindowsの場合,デフォルトの設定では用途によって十分な精度で同期されていませんでした.そこで,出来る限り正確に同期させるための設定を調べたのでまとめます.
windowsのNTPクライアント機能
windowsではW32Timeサービスによって時刻同期が行われています.
このサービスの仕様について以下の様な記載があります.
ネットワーク上のノード間の W32Time サービスの精度は、保証およびサポートされません。W32Time サービスは、時間が重要となるアプリケーションのニーズを満たす完全な機能を備えた NTP ソリューションではありません。W32Time サービスは、主に次の手順を実行するように設計されています。
- Kerberos v5 認証プロトコルが正しく動作するようにします。
- クライアント コンピューターに緩やかな同期時刻を提供します。
W32Time サービスは、1 ~ 2 秒の範囲で同期時刻を確実に維持できません。このような許容誤差は、W32Time サービスの設計仕様に含まれていません。(https://support.microsoft.com/ja-jp/kb/939322)
(追記)
W32Timeサービスはデフォルトで起動していない場合があります.「タスクマネージャー」の「サービス」から起動状態を確認できます.「状態」が「実行中」であれば問題ありません.停止している場合は下記コメントに頂いたように,「サービス管理ツール」から設定を変更する必要があります.
W32Timeサービスの設定
W32Timeサービスの設定を変更することで同期精度を向上させることが可能です.W32Timeサービスの設定はレジスタの変更が必要です.
##NTPサーバ
windowsはデフォルトの設定ではアメリカのサーバを参照していたりします(最近は違う?).ntp.nict.jp
や組織内のntpサーバを使いましょう.なお,組織内でドメインコントローラ等がある場合勝手なこと(これ以降の設定変更)をすると怒られるかも知れません.
##NTPサーバへのポーリング間隔
ntpサーバに対して一定間隔でポーリングを行うことで時刻同期を行っています.デフォルトでは1週間(604800秒)となっています.これではいくらなんでも長すぎるので変更します.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient\SpecialPollInterval
が秒単位のポーリング間隔です.ポーリング間隔を短くしすぎるとサーバ側に負荷がかかってしまいます.
参考までにntp.nict.jp
の場合
1時間平均で20回(1日の合計が480回)を超えないようにしてください。 それ以上が必要な場合は事前にご連絡ください。 (https://www2.nict.go.jp/aeri/sts/tsp/PubNtp/qa.html#q1-4)
この条件を満たすためにはポーリング間隔を256秒以上にします.
なお,W32Timeサービスには現在時刻の精度からポーリング間隔を徐々に長くしていく機能もあるようです.今回は省略します.
##stepモードとslewモード
システムの時刻は,様々なシステムでタイムスタンプとして利用されています.もし時刻に逆戻りが発生するとタイムスタンプが前後してしまうなど問題が発生します.そこで,正しい時刻に瞬時に変更する(stepモード)のではなく,時刻の戻りが生じないように徐々に正しい時刻に合わせる(slewモード)機能が実装されています.
時刻のズレが大きい場合stepモードになりますが,その条件についてはググってください.ここではslewモードにおけるパラメータのについて説明します.
これらはHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\W32Time\Config
内にあります.
UpdateInterval
UpdateIntervalは時刻のズレを補正する間隔を表します.この値が小さいほど頻繁に時刻を修正します.私は100にしました.
設定の反映
GUIの"インターネット時刻設定"から"今すぐ更新"を押下すると反映される?
同期状況の確認
現在のシステム時刻とntpサーバの時刻との差を確認するコマンドがあります.
w32tm /stripchart /computer:ntpサーバアドレス
オプションとして /samples:5
によって表示する回数を指定できます.デフォルトでは無限に表示され続けます(停止するにはCTRL+C).また,/dataonly
を追加することで,オフセットのみ確認できます.
(@ghostさんよりコメントを頂いたので追記いたしました.フィードバックありがとうございました.)
#おわりに
設定を変更することで数ミリ秒から十ミリ秒オーダの精度を維持できていると思われます.
#参考にしたページ
Windows Time サービス - Slew モードと Step モード
デイトレードなときどき日記 - Windows7での時刻合わせ
Windowsネットワーク時刻同期の基礎とノウハウ(改訂版):
第3回 w32tmコマンドとレジストリによるWindows Timeサービスの制御