2015/07/01 うるう秒対策 まとめ

2021-06-18

2012年のうるい秒で、筆者の管理しているサーバーで比較的に新しいカーネルサーバーは、軒並みCPU100%になりうるう秒の障害に直面しました。その時はdateコマンドで時刻を設定してntpdを再起動を実施した記憶があります

2012年のうるう秒から3年、2015年の7月に「うるう秒」が発生します

日本時間の2015年7月1日にうるう秒が追加されることが発表

うるう秒実施日一覧(NICT/日本標準時プロジェクト)

うるう秒とは?

原子時計で測られる標準時刻と地球の自転速度との間に生じるずれを調整する目的で、数年に1度、不定期に挿入される1秒間。

うるう秒の調整実施日

2015年7月1日の午前8時59分59秒と午前9時00分00秒の間に、「8時59分60秒」が挿入される。これにより、当日は1日の時間が1秒分だけ長くなります
通常では、「08:59:59」の次の時刻は「09:00:00」ですが、うるう秒の調整される場合は、「08:59:59」→「08:59:60」→「09:00:00」となります

うるう秒で発生する問題・障害

・2012年7月1日のうるう秒の時は、LinuxサーバのプロセスがCPU100%に張り付くという現象などが発生、筆者の運用しているサーバーもこれが発生しました
・MySQL・Java・FirefoxなどのソフトがCPU100%に張りつく

障害の原因は?

根本的な原因はLinuxカーネルの不具合です、ネットで調べれば詳しく紹介されているサイトがありますのでそちらを参考にして下さい

障害の発生条件

  • 古いカーネル、ntpdをカーネルを利用している
  • ntpd を利用して、上位の NTP サーバと時刻情報の同期を実施している
  • 上位 NTP サーバが「うるう秒情報」を送信してくる
  • ntpd を STEP モードで動作させている(標準で起動した場合このモードになります)

対策

何通りの対策があると思いますが、以下の方法があります

  • うるう秒を迎える時に、ntpdを停止しその後に起動する
  • ntpdをSLEWで起動する

参考URL:うるう秒の影響は受けますか? – Red Hat Customer Portal

ntpdを停止してうるう秒を迎える

ntpd を停止します。

$ sudo /etc/init.d/ntpd stop
ntpd を停止中: [ OK ]

ntptime -s 0 を実行するとカーネルの状態をリセットします。

$ sudo ntptime -s 0
ntp_gettime() returns code 0 (OK)
time d906ad37.ece9e000 Wed, May 20 2015 15:50:31.925, (.925444),
maximum error 20516 us, estimated error 16 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
modes 0x10 (STATUS),
offset 0.000 us, frequency 0.000 ppm, interval 1 s,
maximum error 20516 us, estimated error 16 us,
status 0x0 (),
time constant 7, precision 1.000 us, tolerance 500 ppm,

うるう秒が迎えてから、SLEWモードでntpdateを実行してから、その後ntpdを起動する

$ sudo /etc/init.d/ntpd stop
$ sudo ntpdate -d -B ntp.nict.jp;
$ sudo /etc/init.d/ntpd start

ntpdをSLEWで起動してうるう秒を迎える

ntpd を停止します。

$ sudo /etc/rc.d/init.d/ntpd stop
ntpd を停止中: [ OK ]

ntptime -s 0 を実行するとカーネルの状態をリセットします。

$ sudo ntptime -s 0
ntp_gettime() returns code 0 (OK)
time d906ad37.ece9e000 Wed, May 20 2015 15:50:31.925, (.925444),
maximum error 20516 us, estimated error 16 us, TAI offset 0
ntp_adjtime() returns code 0 (OK)
modes 0x10 (STATUS),
offset 0.000 us, frequency 0.000 ppm, interval 1 s,
maximum error 20516 us, estimated error 16 us,
status 0x0 (),
time constant 7, precision 1.000 us, tolerance 500 ppm,

-x オプション (ntp slew モード) で ntp を設定します。

$ sudo vi /etc/sysconfig/ntpd
### -x オプションを追加
# Drop root to id 'ntp:ntp' by default.
#OPTIONS="-u ntp:ntp -p /var/run/ntpd.pid" コメントアウト ↓ 追加 ↓
OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid"

$ sudo /etc/init.d/ntpd start
ntpd を起動中: [ OK ]
### -x オプションで起動しているか確認する
$ ps -ef|grep ntpd|grep -v grep
ntp 24330 1 0 16:19 ? 00:00:00 ntpd -x -u ntp:ntp -p /var/run/ntpd.pid -groot

もし障害が発生したら

仮にプロセスのCPUが100%に張り付くような2012年と同様の症状が発生した場合は、ntpdを停止して以下のコマンドを実行します

$ sudo /etc/init.d/ntp stop
$ sudo date `date +'%m%d%H%M%C%y.%S'`

うるう秒があるか確認

NTPによってうるう秒の情報が伝わってきているかの確認をする方法です。

 
$ sudo ntpq -c rv
associd=0 status=0615 leap_none, sync_ntp, 1 event, clock_sync,
version="ntpd 4.2.6p5@1.2349-o Wed Oct 9 19:08:06 UTC 2013 (1)",
processor="x86_64", system="Linux/3.13.0-34-generic", leap=00, stratum=2,
precision=-17, rootdelay=21.629, rootdisp=950.751, refid=133.243.238.163,
reftime=d8593032.17d49c42 Fri, Jan 9 2015 1:34:58.093,
clock=d8593065.44e6a51e Fri, Jan 9 2015 1:35:49.269, peer=33242, tc=6,
mintc=3, offset=0.996, frequency=0.193, sys_jitter=0.000,
clk_jitter=0.352, clk_wander=0.000

という情報が確認できます。leap=00というのがLeap Indicatorです。

00 の場合は調整は発生しません
01 正の調整が発生
10 負調整が発生

chrony うるう秒について

(2016/06/25追記)
うるう秒まであと1週間を切りましたが、「chrony」のうるう秒について記載していなかったので追加しときます
「chrony」はCentOS7 から採用されたNTPクライアント兼サーバです。こちらの方はうるう秒の対応は必要がないかと思われます。
「chrony」は、「makestep」「maxslewrate」でSLEWモード、STEP モードの調整が可能です
詳しくは以下のサイトで確認して下さい

Linux脆弱性

Posted by admin