質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

解決済

2回答

11720閲覧

閏秒挿入でなぜ多くのシステムがダウンするのか

ReiHiguchi

総合スコア73

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

8グッド

17クリップ

投稿2017/01/12 16:17

今年の元旦、8時59分60秒が挿入されたことで、多くのエンジニアの年末年始が仕事に追われる日々だったのではないかと思われます。そこで閏秒を挿入することで同期がおかしくなるということなのでしょうが(そもそもこの認識が間違っているのならご指摘下さい)この”おかしくなる”の詳細がわからず調べていたのですが、詳しく踏み込んだ説明はあまり見当たりません。CPU使用率が100%になりサーバーがダウンするということがあるというのも見つけたのですが、先の認識とCPU使用率の増加がいまいち繋がりません。どなたかご教授いただけないでしょうか。

takotakot, mpyw, stereo_code, Juraku-Software, dlrowolleh, ccccididid, 1ft-seabass, T_sa👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

大きなポイントとして3つ有るかと思います。
1つはタイムアウト判定などの時刻間計算のロジックが閏秒の挿入により狂う(8時59分59秒と9時00分00秒の差は閏秒により正しくは2秒であるが、1秒と算出してしまう)ことによる計算結果矛盾の発生。これをアプリがエラーとして検出するケース。
1つは時刻のバリデーションチェックで59秒以上(60秒という数値)を弾いてしまい、エラーとして検出してしまうケース。
1つは閏秒のわずか1秒間でもコンピュータは何万命令も実行するため、運悪く閏秒のタイミングにエラー検出してしまい大量のエラーメッセージを出力してしまい運用対応が混乱してしまうケース。
特にDataBaseシステムが閏秒をエラーとして検出すると、自分自身の振る舞いに異常を検出したと判断してDataBase自体が動作を止めてしまうケースが考えられ、こうなると被害は甚大です。

ですが、閏秒については実施の事前に情報が公開されるのでDataBaseシステムのパッチやアプリケーション改修などによってベンダー対応が入ることが一般的です。それでも先に書いたように閏秒の1秒間でもシステムは何万もの命令を実行するため、テストだけでは再現しきれないコンディションも存在します。そんなコンディションのタイミングで初めて露見するバグ(障害)に当たり、運用対応が必要になるケースも有るかも知れません。

エンジニアとしては必要なパッチを全て当てて、事前に閏秒のコンディションを作って検証して不具合を出し切り、当日は警戒感をもって待機するしかないかと思います。私の2000年対応もそのような感じでした。閏秒については机上確認で影響は有り得ない(DataBaseは使用していないなど、システムの性質として発生確立は非常に低い)と判断してゆるめな対応になりました。

投稿2017/01/12 17:29

BlueMoon

総合スコア1339

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

先の認識とCPU使用率の増加がいまいち繋がりません。

おそらく linux kernel でのトラブルの話をされているのかと思います。
それを前提にものすごくざっくり説明します。
この時の bug では、うるう秒挿入時に CLOCK_REALTIME を1秒巻き戻したのに、
clock_was_set() を呼び忘れたことです。
この状況では、高精度カーネルタイマ(hrtimer) の処理時に1秒ずれが生じた状態になります。

このため、hrtimer でタイマーを設定すると1秒早くタイマーが終了してしまう状況になります。

ここで問題なのは1秒未満のタイマーを設定した場合で、1秒未満のタイマーを設定した際に
即座にタイマーが終了してしまいます。
タイマーが切れたため、プログラムはタイマー切れの処理を行います。
タイマー切れの場合に必要な処理を行い、再度タイマーを設定するプログラムであった場合、
この一連の処理はループします。

これらのプログラムが複数呼び出された場合は、システム全体の負荷が高くなります。
1秒ずれた状態は clock_was_set() を呼びだすまで解消されないため、
うるう秒処理後から1秒未満のタイマーを設定する様なプログラムで
高負荷の状況を生み出す事になります。

この問題の解消は clock_was_set() を呼びだして1秒のずれを解消する事です。
date コマンドで解消する記事が多くあると思いますが、それは内部で clock_was_set() を
呼びだしているからです。

ソース: https://lkml.org/lkml/2012/7/1/203

投稿2017/01/17 06:05

編集2017/01/17 08:49
sutasuta

総合スコア36

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問