前回に引き続きNTP関連です。
まだ時間があると思って後回しにしていたうるう秒対策。
とうとううるう秒まであと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は遅刻できませんね。