古いバージョンのブラウザーを使用しています。MSN を最適にご利用いただくために、サポートされているバージョンをご使用ください。

Windows RS5で実装される、うるう秒対応や高精度ネットワーク時間

アスキー のロゴ アスキー 2018/09/23 10:00 塩田紳二 編集● ASCII編集部

 Windows 10の次期アップデートである「October 2018 Update」(RS5)には、時間精度を高める改良が行なわれる。

金融取引に使われるケースを意識して

非常に高精度な時計の精度が求められている

 というのも、米国やEU圏では、電子的な金融取引などに使うコンピュータシステムに対して高い精度の時計機能などが要求されているからだ。具体的には、米国のFINRA(Financial Industry Regulatory Authority)のルールやEU圏のESMA(European Securities and Markets Authority)によるEMIR(European Market Infrastructure Regulation)、MiFID(Markets in Financial Instruments Directive)などである。

 ここではこれらについては具体的に解説しないが、簡単に言えば、電子的な金融取引をするコンピュータでは、一定以上の時間精度、特定の時刻サーバーに一定誤差内で同期することおよび、同期の経過を記録することが求められる。

 このため、Windowsでは以下のように改良が加えられている。

・うるう秒への対応

・PTP(Precision Time Protocol)の実装

・ソフトウェアタイムスタンプ

・クロックソース安定化

・システムログやパフォーマンスカウンターによるトレーサビリティ

そもそも従来のWindowsは

うるう秒自体には対応していなかった

 「うるう秒」の対応は、現在でも大きな問題の1つだ。うるう秒とは、地球の自転による一日の長さが変動するため、原子時計を元にした時刻との差を1秒以内にするための調整である。原因は地球の自転の変動であるため、予告はされるものの、実施は不規則である。地球の自転は、潮汐力などに影響されていること、実際にはデコボコがあるために、回転速度はわずかながら変動しているのだ。蓄積した差分が1秒を越えてしまうと問題が発生するので、そのための調整がうるう秒なのである。

最新のうるう秒の実施は2017年1月1日。サマータイムの導入が話題になったが、うるう秒も正しくソフトウェアを実施しないと実際にトラブルは生じている © ASCII.JP 提供 最新のうるう秒の実施は2017年1月1日。サマータイムの導入が話題になったが、うるう秒も正しくソフトウェアを実施しないと実際にトラブルは生じている

 うるう秒が始まったのは1972年だが、その頃には今のインターネットのように多数のコンピューターがネットワークで接続されているわけではなかったし、パソコンもなかった。このため、うるう秒自体は一般生活とは無関係と考えられていた。しかし、コンピューターが普及し、一部のソフトウェアが時刻に従って動作しはじめると時刻が不連続となることは大きな問題となるケースがある。

 簡単に言えば、うるう秒は1月1日または7月1日の直前で1秒調整する。1秒追加する場合には、23時59分59秒の次は60秒となり、その次が0時0分0秒となる。逆に1秒削除すると、23時59分58秒の次が0時0分0秒となる。タイムゾーンのない協定世界時での実施であるため、日本では1月1日または7月1日の午前9時0分0秒の直前に実施される。

 実はWindowsはこれまでうるう秒にまったく対応していなかったのである。というのも、Windows自身には高精度な時間に従わねばならないような条件がなかったからだ。現在のWindowsは、WindowsTimeサービスにより、NTPプロトコルを使って外部の時刻サーバーと同期している。

 NTPを使った時刻同期では、うるう秒の対応に大きく3つの方法がある。1つはNTPのSTEPモードと呼ばれ、単純に秒を調整してしまうもの。秒の挿入があると、23時59分59秒、0時0分0秒、0時0分0秒と0秒を2回繰り返し、時刻を監視しているソフトウェア側から見ると、時刻が1秒戻ってしまう。しかし、一般的にNTPクライアントは、128ミリ秒以上の誤差を検出した場合にSTEPモードで時刻を合わせる。

 もう1つは、SLEWモードと呼ばれるもので、こちらは、うるう秒が挿入されたあとの1秒の調整を時間をかけてゆっくり行なう方式だ。つまり、1秒の長さをわずかに短くして、10数分から数時間をかけてゆっくりと正しい時刻に合わせていく方式だ。この方式では、時刻が戻ることはないが、短期的に見ると、誤差が大きくなってしまう。アプリケーションのエラーは引き起こさないものの、正しい時刻の測定という点からは問題がある。

 コンピューターのクロック周波数がGHzであり、アプリケーションからみれば、1ミリ秒でも、大量のコードを実行できるため、かなり長い時間となる。SLEWモードでは、正確な時間と最大で500ミリ秒の差ができてしまう。一般的なソフトウェアの実行には問題はないが、今回Windowsが対応するのは、高精度な時刻管理であるため、この方法も使えない。

 もう1つは、NTPサーバー側などで処理する「スミアモード」と呼ばれる修正方法だ。NTPには、うるう秒を伝達する機能はあるが、前述のように問題が発生する可能性がある。うるう秒は最大で年2回あり、予測が可能であるため、うるう秒が起きる前から1秒の長さを調整し、うるう秒の直後の0時0分0秒の時点で正確な時間になるようにするのがスミアモードと呼ばれる手法だ。Googleが提供している時刻サーバーは、このスミアモードを使い、うるう秒を使わないようにしてあるという。

 しかし、今回の場合、時刻を正確に刻む(100マイクロ秒の精度が必要とされている)ことが必要であるため、うるう秒の対応には、どの方法も利用できない。そもそも、うるう秒が存在するのが正しい時刻なのである。このためWindowsでは、うるう秒そのものに対応することになった。マイクロソフトの資料によれば、うるう秒による調整があるケースでは、タスクバーの時計などで60秒が表示されるのだという。

100ナノ秒の精度で秒を調整できるように

 しかし、いくら精度を高くしても、時計自体を協定世界時に合わせる必要がある。精度とは1秒の長さが正確であることだが、その始まりがずれていては問題がある。このため、新規にPTP(Precision Time Protocol)と呼ばれる時刻同期のプロトコルを実装した。

 ただし、これは、高い精度が必要な場合に利用するもので、一般的には従来どおりNTPを使う。NTPではネットワークの遅延が対称的であると仮定しているのに対して、PTPはタイムスタンプを持つパケットを使い、ネットワークの遅延を折り込んで時刻を取得する。ただし、そのためには正しい「時計」を持っている必要がある。一般にこうした時計にはGPS衛星からの電波などを利用する。

 Windowsなど、ソフトウェアで処理する場合、ネットワークスタックなどによる遅延を考慮する必要がある。デバイスドライバーの中とはいえ、その処理時間は一定にはならない。そこでWindowsでは、ネットワークスタックの処理の前と後にパケットにタイムスタンプを付加し、処理にかかった時間を測定できるようにした。

 時計の正確さには、高い精度を保つことも含まれる。つまり、ある瞬間に一致しているだけでなく、長時間その精度を保つ必要がある。PTPを介して得た時刻であっても、誤差は含まれる。

 このためPTPで時刻を受信してそのまま時計を合わせてしまうと、さまざまな要因で変動するネットワーク遅延などの影響を受けてしまう。そこで何回も問い合わせ、自分が持っている時計の進行と、時刻サーバーの時刻の進行を一致させる必要がある。つまり、時刻サーバーから得られた時刻で時計を合わせるのではなく、自身の時計の進行が時刻サーバーと同じになるように進行を調整していくようにしなければならない。このときに自身の時計の調整は、できるだけ細かい単位で調整できるようにしなければならない。

 Windowsで高精度な時間測定には、CPUが持つTSC(Time Stamp Counter)レジスタが利用する。x86、x64では、CPUのRDTSC、RDTSCP命令でTSCレジスタの内容を読み出すことができる。この命令を使ったTSCの読み出しは高速だが、いくつかの問題がある。

 1つは、TSCはコアごとにあり、それぞれが独立しているため、同期させない限り、時刻はそれぞれ違ったものになっている。ソフトウェアが実行されるコアが変わらないようにするのはかなり大変な処理となり、システムや実行しているソフトウェアの大部分に影響を与えてしまう。そこでTSCレジスタの値を同期させておく必要がある。

 Windowsは以前からQPC(QueryPerformanceCounter)というAPIを用意していた。これはコア間のTSCを同期させるなどの初期化処理をし、高精度のタイムスタンプ(TSCレジスタ値)を得るためのAPIだ。ただし、QPCは、TSCが利用できないハードウェアのために高精度タイマー(チップセットに内蔵されている10MHzクロックのタイマー)や、MS-DOS時代からあるリアルタイムクロック(64Hzクロック)を利用することもできる。

 TSCは、CPUクロックと同じ周波数で動作するため、高い精度で時間を測定することができる。Windows Server 2019やWindows10 RS5では、100ナノ秒精度で秒を調整することが可能になるという。

アスキーの関連記事

image beaconimage beaconimage beacon