【うるう秒】あなたのサーバは大丈夫?


はじめに

2015/07/01 09:00 JST において、うるう秒の挿入が実施されることが決定しました
http://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat

NICT/日本標準時プロジェクトの HP にも、同予定が記載されています
http://jjy.nict.go.jp/QandA/data/leapsec.html

前回のうるう秒 (2012/07/01 JST に実施) では、以下のような障害が発生したそうです

  • Firefox、Thunderbird、Java、MySQL、Chromium、VirtualBOX、scsi-target 等、いくつかのスレッドを用いるようなアプリケーションを利用していると、そのプロセスの CPU 使用率がほぼ 100% に上昇してしまう
  • うるう秒補正の瞬間に、カーネルがデッドロックしてしまう

上記で、製品・モジュールなどの名称がいくつか出ていますが、具体的には、内部でスレッドを利用していて、なおかつ、それらスレッドの処理キューを、futex カーネルコールを用いて管理しているようなプログラムの全てが該当するようです

障害の発生条件

前回のうるう秒挿入の際に発生した障害と同様の障害が発生する条件、環境要因は以下のとおりのようです

  1. 2.6-22 以降、3.5-rc7 未満で、本問題の対策が施されていない linux カーネルを利用している
  2. ntpd を利用・常駐させていて、上位の NTP サーバと時刻情報の同期を実施している
  3. 上位 NTP サーバが「うるう秒情報」を送信してくる
  4. ntpd を STEP モードで動作させている

[1.] について – 本障害の影響を受ける linux カーネル

  • RHEL5/CentOS5 : 2.6.18 ベースのため、問題なし
  • RHEL6/CentOS6 : 古い場合問題あり
  • RHEL7/CentOS7 : 3.10 ベースのため、問題なし
  • Ubuntu 10.04(Lucid) : 2.6.32-42.95 にて修正
  • Ubuntu 11.04(Natty) : EOL のため修正対応されず
  • Ubuntu 11.10(Oneiric) : 3.0.0-24.40 にて修正
  • Ubuntu 12.04(Precise) : 3.2.0-29.46 にて修正
  • Ubuntu 12.10(Quantal) or later : 3.5 もしくはそれ以降ベースのため、問題なし
  • Debian 6.0(Sqeeze) : 2.6.32-46 にて修正
  • Debian 7.0(Wheezy) : 3.2.29-1 にて修正
  • SLES11 SP1 : 2.6.32.59-0.7.1 にて修正
  • SLES11 SP2 : 3.0.38-0.5.1 にて修正

[2.] について – ntpd の利用

本問題は、ntpd からカーネルにうるう秒発生情報がセットされなければ、そもそもカーネルがうるう秒の存在を知り得ないため、発生しません。
そのため、ntpd を利用した時刻情報の同期を実施していない場合には、現象は発生しません
ntpd を利用していない場合、1秒挿入されるはずの時刻補正が実施されないため、システムの時間は、世界標準時から見ると、1秒進んだ状態になってしまいます
後述の「tzdata について」も参照してください

ntpd の一部のバージョンを利用している場合、うるう秒の情報がカーネルへ正しく伝達されず、うるう秒の補正処理が全く実施されないため、今回挙げた不具合が発生しない条件もあるようですが、バージョンに関する詳細は調査しきれておらず、詳細不明です

[3.] について – うるう秒情報の配信

日本標準時プロジェクトが運営している NTP サーバ (ntp.nict.jp) をはじめ、mfeed が運営する NTP サーバ (ntp.jst.mfeed.ad.jp) 等、国内で公開されている大半の NTP サーバは、うるう秒に関する情報を送信してくるようです

NTP プロトコルでやりとりされる情報のうち、うるう秒の発生を予告する情報(Leap Indicator)の値が変化するようです

  • 00 – うるう秒発生予告なし
  • 01 – うるう秒が挿入される (23:59:59 → 23:59:59 → 00:00:00 とすることで、1秒遅れさせる) – 前回(2012/07)も、今回(2015/07)も、共にコチラ
  • 10 – うるう秒が削除される (23:59:58 → 00:00:00 とすることで、1秒進める)
  • 11 – うるう秒に関する情報を上位サーバが知らない

NTP の RFC では、当月末のうるう秒発生について予告情報を配信できる決まりになっていますので、2015/06/01 以降、上位 NTP サーバ側から 01 を示す LI フラグの値が配信される可能性があります
2012/07 の際には、NICT では、旧 RFC との互換をとるため、当日(2012/06/30) 以後 LI フラグの値を変更した そうですが、今回の対応時期については、現時点では明言されていないようです

[4.] について – STEP モードと SLEW モード

ntpd には動作モードが2つあり、時刻の補正を出来る限り即時で適用する STEP モードと、システムに影響がでないように、出来る限り小さい単位での補正を長時間掛けてゆっくりと行って時刻のずれを補正する SLEW モードがあります
うるう秒の補正では、1秒という大きな単位でシステム時刻が補正されるため、STEP モードの場合に影響が出てしまいます
SLEW モードで動作させている場合には、小さな補正の積み重ねで時刻を合わせるため、「うるう秒」そのものはシステム上存在しないことになります
そのため、上に挙げたような不具合は発生しないようです

各アプリケーション・モジュール側での対応状況について

  • MySQL (5.5 以降が該当する模様。5.1 は問題なし)
    kernel の不具合なので、MySQL/InnoDB だけに限った問題ではない
    我々が対策・対応するだけでは意味が無いので、対応しません。kernel 側を更新してください
    関連リンク
  • Java
    Date クラス内では正しくうるう秒をハンドリングできている (60/61 秒の存在を扱える)
    あとの問題は、Date クラスを利用するアプリ側の実装次第
    CPU100% 問題については、Java 内部ではなく kernel の問題なので、特別な対応は無し
    関連リンク

事前にできる対策

もちろん、kernel を対応する版に更新するのが最善の策です。
しかし、更新できない場合にはどうするべきでしょう?

  • ntpd を STEP モードではなく SLEW モードで動作させるように構成を変更しておく
    事前に設定を変更し、十分に動作を確認する必要があります
    設定の変更が不十分だと、以下の事象が起こることもあるので、要注意です

    • 時刻のズレが大きい場合に STEP モードでの同期をしてしまう設定が残っていて、うるう秒の際に誤爆
    • 時刻のズレが大きい場合に panic モードで ntpd 自身の動作が停止してしまう
  • 上位サーバがうるう秒の予告情報を送付してくる前に、ntpd を停止し、うるう秒経過後に戻す
    極端ですが、確実です。上位 NTP サーバがいつ頃から予告情報(LI フラグ)を配信するかが明確な場合には、選択肢になるかもしれません
    ntpd を動作させない場合には、世界標準時から1秒進むことになるので、この辺りにも注意が必要です
    後述の「tzdata について」も参照してください

CPU100% な現象が発生してしまったら‥ – 解決・対応方法

  • 現象発生後、ntpd を再起動しても、事象は解消しない
  • 現象発生後、OS を再起動すれば、事象は解消する
  • 現象発生後、CPU 使用率が高くなってしまったプロセスだけを再起動しても、事象は解消しない
  • 現象発生後、date コマンドを利用して、システム時刻を設定し直すと、事象は解消する
  • 現象発生後、ntpdate コマンドを利用して、上位 NTP サーバから時刻情報を取得、システムに再設定を実施しても、事象は解消しない
  • うるう秒経過の時点では高負荷現象が発生していなくても、うるう秒経過後、date コマンドによる時刻再設定を実施しない状態のままで、高負荷事象が発生してしまうようなアプリケーション・モジュールを新規に起動した場合にも、現象が発生してしまう

最後の項目が、案外ワナですね‥。うるう秒の段階でトラブルが起きず、関係ないと思っているサーバについても、キチンと対策だけはしておくことが重要なようです

date コマンドを利用して、強制的にシステム時刻情報を再設定する際に入力すべきコマンド

上記のように入力することで、システムロケールやコンソールのロケール設定状況による影響をうけず、時刻を再設定できるようです

tzdata について

tzdata は、うるう秒だけでなく、サマータイムの実施など、世界各地の標準時に関するデータを纏めたものです。
このパッケージを正しく更新してある場合、ntpd による時刻同期を行っていないシステムであっても、うるう秒の発生する 2015/07/01 には、23:59:59 → 23:59:60 → 00:00:00 とシステム時刻が遷移して、世界標準時からのズレを補正してくれます

NTP 配信での時刻情報では 23:59:59 → 23:59:59 → 00:00:00 と遷移するので、「巻き戻る」という事象に耐性のないプログラムの場合に、不具合を引き起こしましたが、tzdata による補正に頼る場合には、「60秒」という値を正しく扱えないプログラムの場合に、何らかの不具合が発生し得ることに注意が必要です

ちなみに、RHEL6 向けに 2015/01/15 時点でリリースされている最新版「tzdata-2014j-1.el6」では、今回のうるう秒情報は、まだ含まれていないようです

2015/02/10 追記

うるう秒に関する情報が登録されたパッケージがリリースされたようです。
各ディストリビューションでの対応パッケージは以下のとおり。

  • RHEL5 / CentOS5 : tzdata-2015a-1.el5
  • RHEL6 / CentOS6 : tzdata-2015a-1.el6
  • RHEL7 / CentOS7 : tzdata-2015a-1.el7
  • Ubuntu 10.04(Lucid) : tzdata-2015a-0ubuntu0.10.04
  • Ubuntu 12.04(Precise) : tzdata-2015a-0ubuntu0.12.04
  • Ubuntu 14.04(Trusty) : tzdata-2015a-0ubuntu0.14.04
  • Ubuntu 14.10(Utopic) : tzdata-2015a-0ubuntu0.14.10
  • Ubuntu 15.04(Vivid) : tzdata-2015a

参考にさせていただいた情報

本記事を書くにあたって、多数の Web サイトを参考にさせて頂きました。
いろいろまとめて下さった方々に、感謝感謝です‥。ありがとうございます。

「【うるう秒】あなたのサーバは大丈夫?」への2件のフィードバック

コメントを残す