たまにはプログラムとバグの話(その2)

さて、色々書きましたが、プログラムにはバグがつきものです。平均的なプログラマが1万行に1つバグを仕込むとすると、100万行のプログラムには平均して100個のバグがあるという事になります。このバグ率を前提とした場合、あるステップ数のプログラムにバグが含まれない確率というのは、「(9999/10000)^ステップ数」になります。1万ステップあったらバグが無い確率は5PPM、100万ステップあったらプランク定数より10桁も小さな値*1となります。まあ、1万行に1つのバグという確率が高いか低いかはありますが、1桁2桁くらい減っても結果は大差ありません。問題はそのうちどれくらいが致命傷となるのかという事です。

前回のお話で、「たまたま発覚した」と書いたのは、安全を見越した上で数百件程度確保すれば良い領域が、「たまたま仕様のミスで大きいエリアをとろうとしすぎていたために、結果的に89件分もの領域確保がなされていた。そのため、なかなか限界を超えなかった」としても全くおかしくないからであります。つまり、2重のミスで今まで影響が相殺されていたという事です。

まあ、動いているプログラムなんてこんなものですw
達観しすぎかなぁ。

あと、

板情報を配信するプログラムが動くゲートウエイサーバーは計6台。22日午前は、午前9時の立会取引が始まる前の寄付き時点で問い合わせ銘柄数が89を超えた3台がダウン。午前9時の取引開始直後にそれ以外の2台のパフォーマンスが極度に低下した。午前9時15分頃まで最後に残った1台のパフォーマンスも低下したため、午前9時21分から派生商品の立会取引を停止した。

東証のシステム障害、設定ミスをテストでも見抜けず

とありますが、これはフォールトレランスをかねた負荷分散だと思います。1台がハードウエア障害でダウンしても残りの5台に負荷を分散させる事で全体としては、1台が止まったことに気づかれないようにできているという事です。厳密に言うと、たとえば1台につき300件の処理能力が必要だとして、1台ダウンしたら300件×6/5の360件分の処理能力が必要です。同時2台ダウンまでまで想定しているのなら、450件ですね。

で、こんなことをクドクド書いたのは、負荷が低いときに1台ダウンに対処することは可能ですが、負荷が高いときは別だと言う事です。通常は処理能力オーバーの問い合わせがあった時には、エラーを返して無視する仕様だと思いますが。運が悪い利用者からはダウンしているように見えるますが、これは「仕様」って奴です。それでもダウンしているように見えちゃうのです。今回たまたまバグにより3台がダウンしましたが、ダウンしないで負荷オーバーでエラーを返したとしても同じです。1台が処理能力オーバーしたら、その処理を他のゲートウエイに振り分けますので、順次連鎖的に同じように負荷オーバーとなっていき、最終的に全滅してしまいます。

「フォールトレランスの仕組みが導入されている」というと、どんな事態でも絶対ダウンしないように思えてしまいがちですが、それは概念的な話にすぎません。想定外の事象に対してはトレラントではなく、意外な脆弱性が隠れている事は忘れてはならないと思います。

3台がパフォーマンスの低下だけで、踏ん張って残っていたという事は、今回のアップデートでバグを仕込まれたのは3台だけで、残りの3台は元のままだったという事なのかも知れません*2。そして、そのような対処をしても、勝利能力オーバーに対しては、脆弱なままなのです。

← 「へぇ」と思ったらクリックを!

*1:単位系が全然違いますが、笑って許してください。小さい数の典型という事です。

*2:上で言ってる事と違いますが、ご容赦を