conf t

インフラエンジニアのメモ

うるう秒対策

f:id:monaski:20150607185530p:plain

前回に引き続きNTP関連です。

monaski.hatenablog.com

まだ時間があると思って後回しにしていたうるう秒対策。
とうとううるう秒まであと1か月を切ってしまったので、うるう秒対策を調べました。

以下サイトがまとまっていて非常に助かりました。

【うるう秒】あなたのサーバは大丈夫? | 自宅ラック友の会 ポータル

閏秒を迎えるにあたってLinuxでは何を対策すべきか? | Act as Professional

日本時間 2015年7月1日午前9時(UTC 2015/7/1 0:00)にうるう秒が挿入されます。
うるう秒が挿入されると、システムには以下2パターンの影響があります。

1.うるう秒のLIビットにより引き起こされる影響

2.うるう秒によって時刻が狂うことによる影響

1.うるう秒のLIビットにより引き起こされる影響

うるう秒を通知するため、NTPサーバは事前にLIビットでNTPクライアントにうるう秒を挿入するよう伝えるのですが、
これそのものにバグがあり、OSがうまくLIビットを処理できないことに起因するバグがあります。

LIビットが受信されているかどうかはntpq -c rvで確認できます。
leap=00であれば挿入されていません。

対策
その1 カーネルのアップデート
RHEL/CentOSの場合はkernel-2.6.32-358.el6以降であれば問題ないようです。

Systems hang due to leap-second livelock. - Red Hat Customer Portal https://rhn.redhat.com/errata/RHSA-2013-0496.html

その2 NTP同期を一時的に停止
LIビットを受信しないように、一時的にntpdを停止し、うるう秒後に戻す作戦です。
ここで問題となるのがいつLIビットが送信されるかなのですが、今年も3年前と同様1日前からの通知となるようです。

 このサービスにおけるうるう秒対応は、次のようになります。(1) (1)事前のおしらせ  うるう秒実施予告情報としてNTPパケットの中のLIビット(Leap Indicator)が前日の2015年6月30日9時(日本時間)より"01"となります。(2) この情報はうるう秒実施時の2015年7月1日9時(日本時間)に解除されます。

日本標準時プロジェクト うるう秒対応

LIビット受信後でも、それをリセットすることも可能なようです。
Leap Second Insertion フラグを受信後にそのフラグを削除する - Red Hat Customer Portal

2.うるう秒によって時刻が狂うことによる影響

うるう秒挿入対応していないOS、うるう秒の際に1の影響を防止するためNTP同期を停止などさせた場合、
うるう秒が挿入されないため、うるう秒以降はOSの時計が世界より1秒進んでしまってることになる。

デフォルトのNTPでは時刻のずれが128msより小さかった場合はSLEWモードで時間の調整をするため、時刻戻りは発生しない。
それ以上の場合はSTEP同期となるため、時刻戻りが発生する。

Under ordinary conditions, ntpd slews the clock so that the time is effectively continuous and never runs backwards. If due to extreme network congestion an error spike exceeds the step threshold, by default 128 ms, the spike is discarded

Slew同期
1秒の長さをわずかに変えていくことで時刻を調整する。時間が戻ったりはしない。

STEP同期 時刻のずれが大きいときに実行される。時刻を戻す。

時刻計算をしているアプリケーションが動作している場合、時刻が狂うことで 正確な計算ができなくなる可能性があるので問題になってきます。

対策

時刻戻りしないように常にSlewで同期するようにする

slew同期オプション(-x)をntpdにつける(RHEL/CentOsの場合)
/etc/sysconfig/ntpdを編集する

# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g"

以下のように-xをつけます。

# Drop root to id 'ntp:ntp' by default.
OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid -g -x"

ntpdを再起動します。

$ ps aux | grep ntp
ntp       1897  0.0  0.1  30716  2068 ?        Ss   May24   0:03 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g
ope       6852  0.0  0.0 107456   912 pts/0    S+   23:30   0:00 grep ntp
$ sudo service ntpd restart
ntpd を停止中:                                             [  OK  ]
ntpd を起動中:                                             [  OK  ]
$ ps aux | grep ntp
ntp       6867  0.0  0.1  30716  2048 ?        Ss   23:30   0:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g -x
ope       6870  0.0  0.0 107456   912 pts/0    S+   23:30   0:00 grep ntp

余談
それにしても日本の場合はUTC + 9なので朝9時ですが、UTC +0の国はホントに0時に挿入されるわけですよね?
イギリスのエンジニアは深夜待機とかやるんでしょうか?お疲れ様です。
日本のインフラエンジニアの皆様も7/1は遅刻できませんね。