Windows Timeサービスの動作は、関連するレジストリ値を調整することで制御できる。権限を持った時刻サーバ設定や、同期先NTPサーバや同期間隔といった、基本的な設定に関するレジストリ値は前回の記事で紹介したので、そちらを参考にしてほしい。今回は、基本的な設定以外で役に立つレジストリ値について、いくつか紹介しよう。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\Config |
値の名前 | MaxAllowedPhaseOffset |
型 | REG_DWORD |
値 | 1(ワークグループ)、300(ドメイン) *数値は10進数 |
slewモードで同期する範囲の設定 |
連載第1回で紹介した「slewモード」を使うことで、時刻が後戻りすることなく、ゆっくり時刻を同期することができる。MaxAllowedPhaseOffsetレジストリ値は、slewモードで同期を行う最大の時刻差を指定する。たとえば“300”と設定すれば、NTPサーバと300秒(=5分間)以下の時刻差であればslewモードで同期を行い、それを超える場合stepモードで、すぐに時刻を同期する。デフォルト値はワークグループ環境で“1”、ドメイン環境で“300”なので、特にワークグループ環境でのWindows Timeサービスをslewモードで動作させたい場合、調整が必要だろう。
ただし、slewモードで時刻同期を行う場合、以下2つのレジストリ値も関連するので、注意が必要である。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\Config |
値の名前 | PhaseCorrectRate |
型 | REG_DWORD |
値 | 1(ドメイン・コントローラを除く)、7(ドメイン・コントローラのみ) |
値の名前 | UpdateInterval |
型 | REG_DWORD |
値 | 360,000(ワークグループ)、30,000(ドメイン・メンバ)、100(ドメイン・コントローラ) *数値は10進数 |
時刻の修正レートの設定 |
PhaseCorrectRateレジストリ値は、NTPサーバから受け取った時刻サンプルに対してシステム時刻を修正する速度を制御するもので、値が小さいとゆっくり修正し、値が大きいと素早く修正する。またUpdateIntervalレジストリ値は、修正を行うサイクル時間(どのくらいの時間間隔でクロックの修正を行うか)を指定し、値が小さいほど短い間隔で修正動作が繰り返される。
Windows Timeサービスにおいて、slewモードで同期を行うためには次の2つの条件が必要である。
NTPサーバとの時刻差およびクロックレートの値はClock Tick(1msecが10,000Clock Tick)として求めるため、1,000(msec)×10,000(Clock Tick)=10,000,000を乗算する必要がある。クロックレートはシステムクロックの速度を制御するものであり、ハードウェア(主にCPU構成)に依存する。クロックレートの実際の値は、w32tm /query /status /verboseコマンドの「クロック レート」の表示で確認できる。
仮にMaxAllowedPhaseOffsetレジストリ値が要件を満たしていても、PhaseCorrectRateおよびUpdateInterval値によっては、slewモードで時刻同期ができないことがあるので注意してほしい。例えばドメイン環境で、参照先NTPサーバと同じ時刻差になっていても、ドメイン・コントローラとメンバ・サーバでは同期の結果が異なるケースがあるのだ。
例として、参照先NTPサーバと30秒の時刻差があり、クロックレートが0.0156秒のドメイン・コントローラとメンバ・サーバがある場合を考える。デフォルト値が300である「MaxAllowedPhaseOffsetレジストリ値より小さい」という条件1の要件を満たしていても、結果としてドメイン・コントローラではslewモードではなく、stepモードで同期される。条件2の計算式を満たさないためである。
なおWindows Server 2008 R2およびWindows 7のWindows Timeサービスでは、時刻が遅れていても進んでいても、上記の2つの条件を満たせばslewモードとして動作する。Windows Server 2003 R2以前の動作からは変更されているので注意してほしい。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\Config |
値の名前 | EventLogFlags |
型 | REG_DWORD |
値 | 0=記録しない、1=不連続で修正された秒数を記録、2=NTPサーバからの時刻データ受信を記録、3=両方のログを記録 |
イベント・ログに記録する内容の設定(1) |
Windows Timeサービスの時刻同期の状態は、デフォルトでは、参照先NTPサーバからの時刻データ受信(イベントID 37)および時刻サンプルとシステム時刻の同期(イベントID 35)のタイミングでイベント・ログに記録される。
このレジストリ値では、参照先NTPサーバからの時刻データ受信(イベントID 37)および不連続で修正された時刻の秒数(イベントID 33)を記録するかどうかを設定できる。イベントID 33は、システム時刻がStepモードで同期した際、どのくらい時刻が変更(ジャンプ)したのか記録される。slewモードで連続的な変更が起こった場合は記録されない。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\TimeProviders\NtpClient |
値の名前 | EventLogFlags |
型 | REG_DWORD |
値 | 0=記録しない、1=NTPサーバとの時刻差を記録、2=システム時刻の同期を記録、3=両方のログを記録 |
イベント・ログに記録する内容の設定(2) |
このレジストリ値では、参照先NTPサーバからの時刻データを使って同期(イベントID 35)およびNTPサーバとシステム時刻の時刻差の秒数(イベントID 51)を記録するかどうかを設定できる。イベントID 51は、NTPサーバとシステム時刻にどのくらいの時刻差があるのか記録される。slewモードで連続的な変更が起こった場合は記録されない。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\Config |
値の名前 | MaxPosPhaseCorrection |
型 | REG_DWORD |
値 | 54,000(ワークグループ)、4,294,967,295(=0xffffffff。ドメイン) |
値の名前 | MaxNegPhaseCorrection |
型 | REG_DWORD |
値 | 54,000(ワークグループ)、4,294,967,295(=0xffffffff。ドメイン) |
時刻同期の範囲の設定 |
このレジストリ値では、slewモードやstepモードに関係なく、時刻を進めたり遅らせたりする範囲そのものを指定する。MaxPosPhaseCorrectionレジストリ値が、時刻を進めることが可能な範囲を、MaxNegPhaseCorrectionレジストリ値が、時刻を遅らせることが可能な範囲を、それぞれ秒数で指定できる。デフォルト値はWindows Server 2003R2以前と同じ値であり、4,294,967,295秒(0xffffffff)を指定することで、機能を無効化できる。
ただしWindows Server 2008以降のデフォルト設定として、マイクロソフトでは172,800秒(=48時間)を推奨している。これは、中途半端な時間を設定すると、予期しない同期の拒否や、問題が発生した際のデバッグがやりにくくなるため、ということのようである。そのため、12時間や24時間、48時間といった区切りで設定するとよい。詳細については、次のサポート技術情報を参照していただきたい。
項目 | 内容 |
---|---|
キー | HKEY_LOCAL_MACHINEの SYSTEM\CurrentControlSet\services\W32Time\Config |
値の名前 | FileLogName |
型 | REG_SZ |
値 | ログ・ファイルのパス名。「C:\Windows\Temp\w32time.log」などを指定する |
値の名前 | FileLogSize |
型 | REG_DWORD |
値 | ログ・ファイルのサイズ(bytes)。1,000,000などを指定する |
値の名前 | FileLogEntries |
型 | REG_SZ |
値 | ログ・ファイルのエントリ値。「0-300」などを指定する |
値の名前 | FileLogFlags |
型 | REG_DWORD |
値 | 0(可読できる時刻表記)、1(NTタイム・エポック形式の時刻表記)、2(ローカル・システム時刻表記) |
W32timeデバッグ・ログの取得の設定 |
Windows Timeサービスの時刻同期でトラブルシュートを行う場合、サービスの詳細な動作を解析するために、w32timeデバッグ・ログを有効にするとよい。このログはw32tm /debug /enableコマンドで設定できるが、直接レジストリ値で設定することもできる。
w32timeデバッグ・ログの概要については、サポート技術情報の「Windowsタイムサービスのデバッグログを有効にする方法」を参照していただきたいが、レジストリ値で設定する場合、FileLogNameレジストリ値(ログ・ファイルのフルパス)、FileLogSizeレジストリ値(ログ・ファイルのサイズ)、FileLogEntriesレジストリ値(ログ・ファイルのエントリ値)を利用する。また、w32tmコマンドでは設定できないが、FileLogFlagsレジストリ値を2に指定することで、デバッグ・ログの時刻表記が「ローカル・システム時刻」となって、大変読みやすくなる。
なおFileLogEntriesレジストリ値に指定する値だが、すべての動作についてのログを取得するのであれば“0-300”となり、通常はこの設定で問題ないだろう。ただしデバッグ・ログの記載項目を減らして見やすくしたいといった場合、これを制御することも可能である。詳細な意味については、TechNetの「Parameters\W32Time > Config Subkey > FileLogEntries」に記載があるので、参考にしていただきたい。
次回の最終回では、w32timeデバッグ・ログの判読方法や、Windows Timeサービスでのトラブルシュートに関する情報をお知らせする予定である。
Copyright© Digital Advantage Corp. All Rights Reserved.