パスワードを忘れた? アカウント作成
12205991 journal
日記

marusaの日記: LinuxとntpのslewモードとLeapIndicatorビット

日記 by marusa

前回2012年のうるう秒挿入ではLinuxカーネルの不具合でカーネルがパニックしたり
CPUを100%消費したりといった問題が一部で起きました。
http://www.sakura.ad.jp/news/sakurainfo/newsentry.php?id=655

今年も同じことが起こらないように調査と対策を実施中です。
うちでは、後ほど記載する3案のうち対策2を実施しました。
(ntpdをSLEWモードに切り替える。)

まずLinuxカーネル側の状況について。

RHEL/CentOSでは、CentOS5はカーネルが古く問題の不具合が存在していない。
CentOS7では対策済みのカーネルになっている。CentOS6の場合はすこし微妙で
RHEL/CentOS6.3までは不具合のあるカーネルが存在する。
RHEL/CentOS6.4では修正済みカーネルになっている。

http://www.rack.sh/linux-leap-second/
>(一部が修正) : RHEL/CentOS6.3 : kernel-2.6.32-279.5.2.el6
>(完全な修正) : RHEL/CentOS6.4 : kernel-2.6.32-358.el6

バグの引き金はNTPのLIビットで、LI(LeapIndicator)がオンであり
かつうるう秒が挿入されていない状態にあるとき、カーネルパニック
を引き起こすバグがある。

またうるう秒が挿入されたときに、そのことをLinuxカーネルに通知しない
バグがありそのためにfutexに起因する負荷上昇が起きる。

メカ二ズムの詳細は下記
http://ringeye.jawfish.org/~ori/misc/leapsecond-20120701.html

対策としては以下の通り。

対策1:対策済みカーネルにバージョンアップする
kernel-2.6.32-358.el6以上にすればOK。
ただしミッションクリティカルなサーバでカーネルのバージョンアップ
そのものが不可能だったり、カーネルバージョンアップ後の再起動が
できない環境もあるので、その場合は対策2で逃げる。

対策2:ntpdを最新にバージョンアップしたうえで、ntpdを
STEPモードからSLEWモードに切り替える。

手順としてはこんな感じ
1. ntp のバージョンアップ
# yum update ntp

2. ntpdを停止する
# service ntpd stop

3. kernelの保持時刻・周波数オフセットをクリアする
# ntptime -s 0 -f 0

4. ntpdをslewモードで起動するようセット
# vi /etc/sysconfig/ntpd
- OPTIONS="u ntp:ntp -p /var/run/ntpd.pid -g"
+ OPTIONS="-x -u ntp:ntp -p /var/run/ntpd.pid -g"
  -xオプションを追記して保存

5. ntpd を起動
# service ntpd start

この場合、カーネルは相変わらずLIビットが立ったままの時にカーネルパニック
を起こす問題が残っているはずで、対策になってない可能性がありましたが、
ntpdがSLEWモードで動作しているときにはLIビットがONにならず、また
8:59:60もカウントされないので問題ないようです。

http://hiroki.jp/leap-second-2015
>またSLEWモードで起動しているとうるう秒を挿入しなくなります。
>(後述するLeap Indicatorがセットされない)

ただしここで注意が必要なのが、ntpパッケージのバージョンです。
ntp-4.2.6p5-3.el6_6未満のバージョンでは、-xを付けても正しく
動作しないバグがありました。最新のntpdに更新しておく必要が
あります。
https://rhn.redhat.com/errata/RHBA-2015-0690.html

うるう秒をカウントしない分、9:00:00の時点ではサーバの時計が1秒進むことに
なりますがntpdが再度上位と同期して時刻が進んでいることを検知すると毎秒
0.5msずつ時計を遅らせて最終的には正しい時刻になります。

(別解)
ntpdのバージョンアップや設定変更などはサーバの数が少ない環境ならば
現実的ですが、何千台もある環境ではやってらんないことになります。
問題なのはntpで伝達されるLIビットなので、これが伝わらないようにすればいい
ということで、組織内のntpサーバの上にもう一つ問題修正済みのカーネルと
最新のntpdをインストールしたntpサーバを用意し、ここでLIビットを落として
しまうという解が提示されています。

http://qiita.com/kirksencho/items/a4f8aa64e1ec2aca2af7

新たに建てる上位ntpdでは、スタンドアロンモードにしてクライアントを
受け付けないようにし、別のntpd実装であるchronyを使ってLIビットなしの
ntpサービスを提供するのが肝のようです。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

192.168.0.1は、私が使っている IPアドレスですので勝手に使わないでください --- ある通りすがり

読み込み中...