うるう秒まとめ

今年は、2015/07/01 08:59:60 JST としてうるう秒が挿入されます!(うるう秒実施日一覧)

うるう秒なんてきちんと処理したくない」という人向けのまとめ。

AWS

  • 事前にご確認ください - AWSでのうるう秒対応
  • うるう秒の時点が最大となる0.5秒のズレが計算式(単純な割合)として保証されている。とても素直な実装。
  • EC2等はUTCに同期しているので、AWS側が提供するサービスと時刻が0.5秒ずれる可能性がある。
  • AWS調整時刻(AWS Adjusted Time)を提供するNTPサーバは用意されていない?

GCP

前後10時間ずつ、計20時間かけて調整

  • 最大で0.5秒前後0.5秒のズレ。
  • うるう秒の前は「lie(t) = (1.0 - cos(pi * t / w)) / 2.0」の計算式に沿うが、うるう秒後はSLEW相当?
  • 「おおよそ 100 万分の 14 ずつ」(0.5秒/10時間)ずらして、うるう秒前後で最大0.5秒ズレる。
    • 2011年の時は上記の複雑な計算式を利用していたが、2015年では単純な手法に変更された。
  • metadata.google / metadata.google.internal としてNTPサーバが提供される。外部への提供はない(もし必要なら自前でNTPサーバ建てて公開すれば良い)。

Microsoft Azure

  • 資料が見つからなかった。

ntpd SLEW mode

うるう秒直後時点で1秒時計が先に進むが、そのあと少しずつ修正される。

ntpd LI flag + STEP mode

Leap Indicatorフラグを元に、うるう秒直後に1秒巻戻る。

  • 最重要ポイント: 時間が逆行する(同じ1秒間が二度繰り返される)

23:59:59.000000(→ 23:59:59.999999)→ 23:59:59.000000 → 00:00:00.000000

Windows

ドメイン コントローラーの場合】
(略)
つまり、NTP Server との時刻差が 5.25 秒未満、もしくは 3.5 秒未満の場合は、Slew モードで時刻同期が行われる結果となります。

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

【ワークグループの場合】
(略)
つまり、NTP Server との時刻差が 1 秒未満の場合は、Slew モードで時刻同期が行われる結果となります。

雑感

この中だと「0.5秒ずらしておく」で丁度良い人が多そうだけどAWSGCPでも実装が異なるし、基盤をまたいで時刻を統一するのは諦めた方が良さそう。0分0秒の方をきっちり合わせたい人が多そうだから、あらかじめ最大1秒進めておくのもアリなのではと思うけど、そういう実装はないようだ。

エンタープライズ用途とか、0分0秒の厳密さが求められる場合には、マルチフィードみたいな正しくLeap Indicatorを実装したNTPサーバと同期する必要したうえで、その場合もミドルウェアやアプリケーションが正しくうるう秒(59分60秒999999)を扱えることを確認する必要がある。

追記

  • 2015-05-22 21:00 AWSについて、EC2系はAWS調整時刻ではないことを追記、AWSGCPのNTPサーバ提供有無について追記
  • 2015-05-26 14:00 新しい記事によるとGCPは単純な計算式に変更されたようなので修正
  • 2015-05-29 13:42 NICTの説明資料を追加