うるう秒-2015

  • 投稿者:
  • 投稿カテゴリー:Linux

うるう秒について

うるう秒とは、国際原子時計(TAI)と天文時(UT)とのズレを修正するための仕組み
1972年からこの7月1日までに、25回実施されている(これまでのところ25回すべてが挿入)

時間を挿入する場合
「08:59:59」→「08:59:60」→「09:00:00」
となる
先進国はうるう秒を無くす方向で進めようとしているが、決定していない
たとえ決定したとしてもあと何回かはある予定

過去事例-2012

・24時間前から、NTP(Network Time Protocol)経由のうるう秒実施予告を受け取った
 Linuxベースのシステムで動作に異常があり、再起動が必要になった
・Linuxカーネルの一部のバージョンでうるう秒挿入後にCPU使用率が上昇した

前者は、NTPの不具合

後者は、うるう秒の処理時にclock_was_set()を呼んでないなかったため
futex(ast Userspace Mutex) 関連のタイムアウトが大量に発生したことが原因。
Mutexとはマルチタスクシステムにおいて、
ある瞬間にある1つのプロセス(スレッド)だけが特定のデータを操作できるようにするためのソフトウェア技術

clock_was_set() は時刻が変更したことをhrtimer(カーネルで高精度タイマーを実現する仕組み)に通知している
v2.6.22 以降のカーネルでうるう秒処理の中でclock_was_set() を呼ばなくなっており、
カーネルでタイマーを実現するための時計と、システムクロックが1秒ずれたため、タイムアウトが発生したらしい

ntpでのLeap Indicator確認方法

Linuxカーネルにおいて、事前にLeap Indicatorを受信する
NTPによってうるう秒の情報が伝わってきているかの確認することが可能
 00 調整は発生しません
 01 正の調整が発生
 10 負調整が発生
root@vmdepot-debia:/etc# ntpq -c rv | grep “leap=”
processor=”x86_64″, system=”Linux/3.2.0-4-amd64″, leap=00, stratum=3,

Linuxで試しに時間を進めてみた

root@hostname:/home/shimizu# cat gettimeofday.pl
use POSIX;
use Time::HiRes qw(gettimeofday sleep);

while("You hate leapseconds"){
        my ($sec, $usec) = gettimeofday;
        printf("%s.%06d\n", POSIX::strftime('%H:%M:%S', localtime($sec)), $usec);
        sleep(0.1)
}
root@hostname:/home/shimizu# date --set="2015/7/1 8:59"
root@hostname:/home/shimizu# perl ./gettimeofday.pl
08:59:58.801939
08:59:58.902272
08:59:59.002524
08:59:59.102761
08:59:59.203031
08:59:59.303351
08:59:59.403578
08:59:59.503831
08:59:59.604098
08:59:59.704361
08:59:59.804660
08:59:59.904920
09:00:00.005171
09:00:00.105432

後日談

そのいち

debian7,8にて、9時直前にntpdを停止したが「8:59:59」が2回発生した
すでにLeap Indicatorをカーネルに伝えていたため
ntptime -s 0
を実施して、カーネルの状態をクリアするべきだった

そのに

ntpdが入っていなくても、最新のtzdataパッケージが適応されていれば
「08:59:60」がカウントされるという情報があった
ntpdが入っておらず、最新のtzdataパッケージが適用されているサーバがあったが
「08:59:60」がカウントされることはなかった
普通に「08:59:58」→「08:59:59」→「09:00:00」とカウントされた
この情報の真意はわからなかった

Windows

Windowsオペレーティングシステムでは、うるう秒の処理をおこなわない
なお、うるう秒が発生した瞬間は、うるう秒を対応しているNTP サーバーに対して、1 秒の時刻差異が生じる
その後の時刻同期にて正常な時刻に補正する

参考URL

2012 年 7 月 1 日のうるう秒挿入時に発生した Linux カーネルの不具合に関する情報
http://ringeye.jawfish.org/~ori/misc/leapsecond-20120701.html
うるう秒に関するサポートについて
https://support.microsoft.com/en-us/kb/2722715/ja
2015/07/01 うるう秒対策 まとめ
http://ex1.m-yabe.com/archives/1000