Blog

うるう秒の検証はしましたか?エンジニアが安心して年を越すために


Dynalystの黒崎です。
今年も残すところあと5日となり、あっという間でしたね。

ご存知の方がほとんどかとは思いますが、来年2017年1月1日にうるう秒が挿入される事が決まっています。
参考: 「うるう秒」挿入のお知らせ ~ 来年の元日はいつもより1秒長い日となります ~

簡単に言うと、原子時計に基づく時刻と天文時に基づく時刻のずれを調節するために、JSTで言うところの2017年の1月1日8時59分59秒と9時00分00秒の間に「8時59分60秒」が挿入されるというものです。
直近だと2015年7月1日にうるう秒の調整が行われました。

2015年におおよそのトラブルとなるような要因は修正されたかと思いますが、今回はUTCで年をまたぐ時の調整ですし、安心して年を越すために検証方法を確認しておきましょう。

検証環境

AWSのt2.microインスタンスを2台つかって実験しました。
OSはAmazon Linux 2016.09.1.20161221です。

AWSのうるう秒の対応状況については事前にご確認ください – AWSでのうるう秒対応【更新】が詳しいです。

EC2インスタンス上で動くAmazonLinuxのサーバに関してはうるう秒に対して特別な対応はされていないので、UTCで23時59分59秒が2回繰り返されます。

SNTPサーバ

うるう秒を再現するにあたって、うるう秒前後の時刻情報を配信してくれるNTPサーバが必要です。

NICTの日本標準時グループのサイトにあるうるう秒テスト用のスクリプトを使いました。 うるう秒とコンピュータクロック

2005年のうるう秒の検証用になっているので、2016年用に書き換えたものが以下です。

ハイライトした15行目の”$USO_LEAP = timegm( 0, 0, 10, 27, 12-1, 16 );”ですが、実験を行う実時間に合わせて書き換えてください。
現在時刻が2016/12/27 09:00 (UTC)だったとして、2016/12/27 10:00 (UTC)にうるう秒を発生させたい場合はこの例のような設定になります。
5分後にうるう秒が発生するようにして実験したところ、うまくいかなかったので余裕を見て20分くらい後に発生するようにすると良いです。

実験用サーバ

うるう秒による影響を確認したいアプリケーションを動作させておきます。
ここでは、単純にタイムスタンプを出力し続けるアプリケーションを作成しました。

実験

SNTPサーバを起動します。
SNTPサーバを起動するためにはntpdを止める必要があるので、ntpdは事前に止めます。

もう一方のサーバでNTPサーバの参照先を書き換えます。

serverの項目でAWSのNTPサーバが指定されているのでそれを全てコメントアウトして、下の二行を書き足します。IPアドレスはSNTPサーバのものを指定してください。

 

時刻がうるう秒が発生する約20分前になったのがわかります。一足早く年越し気分が味わえますね。

時刻同期の確認をするコマンドを打ちます。

 

一つ目のコマンドでleap=01となっていればうるう秒が発生するというフラグを受信できていることになります。
この状態でアプリケーションを起動して、挙動の確認をおこないます。

 

1回目の59分59秒が訪れたあとに、もう一度59分59秒が記録されています。
ちなみに、うるう秒によって1秒挿入された場合は/var/log/messagesにログが出ます。

 

時間遡行とかタイムリープと聞くとかっこよさそうですが、どう考えてもやっかいですね。
この状況でアプリケーションが正常に動作して特に問題が起きなさそうであれば何も対策する必要はありません。
アプリケーション内にタイムスタンプの前後関係を利用している処理があると意図しない動作が起きる可能性があるので、許容できるものなのかをきちんと検討した方がよさそうです。

対策

もし困る事がある場合はNTPサーバの参照先をtime.google.comに向けるとよさそうです。
今年からGoogleが誰でも使えるNTPサーバを公開しています。https://developers.google.com/time/
このNTPサーバはうるう秒を発生させずに、徐々に時間をずらして差を埋める実装がされており、利用者はうるう秒の事を気にしなくてよいようになっています。

外部のNTPサーバが参照できない場合は、ntpdの設定(/etc/sysconfig/ntpd)のOPTIONSに”-x”というオプションを足すことで、うるう秒が追加されずに、徐々に時刻を修正するSLEWモードで動作してくれるので、時間遡行が発生しません。

SLEWモードで動作させた場合は/var/log/messageに

といううるう秒を無視するよ、というログがUTCで年をまたぐ時に出力されます。

これでうるう秒に関しては気にせず正月が過ごせますね。
それではよい年越しを!

Author

アバター
kurochan