新・闘わないプログラマ No.81

それは夕立のように


それはいつもいきなりやってくる。
もう10年近く前の7月のとある金曜日、休み明けからカットオーバーするとあるシステムの稼動準備もつつがなく終わった。このシステムは、当時としては先進的な、UNIXワークステーションとサーバーを中心に据えたクライアント・サーバーシステムであった。当時、その方面に詳しいやつが社内にほとんどいなかったため、別部署にいて、本来ならお門違いの私に声がかかったのであった。
さて、夕方、順調に仕事を終えた私は、帰り支度を始めたのであった。今夜はM美の誕生日を祝うため、夕方に落ち合う約束をしている。週末はM美の部屋で二人だけで過ごす予定だ。
帰ろうと席を立った瞬間、机の上の電話が鳴った。嫌な予感がする。私はそのベルの音を無視して帰ろうか、とも思った。

「もしもし」
私は仕方なく電話に出た。
「あ、すみません。例の休み明けからカットオーバーのシステム、なんか変なんですよ」
「ん? 変?」
「そうなんですよ」
「どこがどう変なんだよ」
「いや、負荷テストをやっていたら、サーバーのプロセスがいくつかcoreを吐いて落ちちゃうんですよ」
「で、原因は?」
「それがわからないから困っているんですよ」
「困っていると言われてもなあ。どう? 直る目処はあるの?」
「いや、全然。だから助けて下さいよ」
「私はもう帰るところだったんだけどなあ。それにその部分は君の担当だろ?」
この電話が、地獄の3日間の始まりであった。

やれやれ、今日のデートは中止か。M美の家に電話するが、すでに出かけているようだ。留守録が応答する。私はメッセージを入れる。今日は行けなくなった、すまん。
しかし、M美のやつ、怒るだろうな。
私はいそいでサーバーの設置してあるコンピュータルームに急いだ。
ここは私のオフィスから歩いて5分ほどのところにある。バブル景気で、倉庫街だったこの近辺にも新しいビルが立ち並んできた。その一角のビルの9階に件のコンピュータルームはある。玄関の受付でIDカードを見せ、エレベータで9階に向かう。コンピュータルームのドアの横にはカードリーダが取り付けられており、先ほどのIDカードを通すと、ドアが開く仕組みになっている。セキュリティは厳重だ。

「あ、すみません。お呼びしちゃって」
「で、どんな状況なんだ?」
「複数のクライアントから大量のトランザクションを発生させて負荷テストをやっていたのですが、ある程度以上の負荷をかけると決まってサーバープロセスが落ちるんですよ」
サーバープロセスのように、沢山のクライアントから複数の要求(トランザクション)を同時に受けるような処理では、それなりのプログラムの組み方が必要になる。このあたりの考え方に慣れていないプログラマが作ったプログラムは、往々にして単体テストでは問題が無くても、複数の要求を同時に受けるとおかしな動作をしたり、うまく動作しなくなったりする。しかも、この手のバグはタイミングによって顕在化したりしなかったりするのでタチが悪い。
障害が発生したのはサーバーの要となるプロセスで、これが落ちればシステム全体が停止してしまう。放置は出来ない。システムのカットオーバーまであと2日半。

「おい、どうなってるんだ?」
いやな奴が来た。こいつはこのシステムの開発の最高責任者ということになっている役員なのだが、よく知らないくせにあちこち引っ掻き回して、足を引っ張っているだけの存在なのだ。
「このシステムが休み明けに稼動しなかったら大変なことになるんだぞ」
そんなことはお前に言われなくてもわかっている。
「状況をわかりやすく説明しろ」
まだ、調べている最中だよ。そもそもお前にわかりやすく説明していたら時間がいくらあっても足りない。今までの会議だって、お前に説明するだけで時間の大半を費やしていたんだからな。
ちょうどそのとき、都合のいいことに課長がやってくる。こいつの世話は課長に押し付けて、私たちは原因の究明にとりかかる。

タイミングによって顕在化するバグは、それをつかまえるのが難しい。とにかくバグが発生した瞬間を捕まえないことには、原因を突き止めることが出来ない。まず私たちは、現象の再現をさせるべくテストにとりかかる。
まず、負荷テストを行うと、確かに数分でプロセスが落ちる。しかし、沢山のトランザクションを送り込んでいるため、これだけでは、いったいどのトランザクションが引き金になって現象が発生したのか分からない。
ふと時計を見ると夜の10時を過ぎている。M美の家に電話する。「バカ!」と一言、電話は切れた。やはり怒っているらしい。当然といえば当然だが。
そう言えば腹が減った。若いのに食べ物を買いに行かせる。本来ならコンピュータルームで飲食など言語道断なのだが、そんなことは無視して、食べながらテストを続行する。
相変わらず現象を捕まえることが出来ない。このコンピュータルームには窓が無く、外の様子が全く分からないが、夜が明けてる頃だろう。結局徹夜になってしまった。猛烈に眠い。徹夜すると、明け方が一番眠い。体内時計の働きなのであろう、それを過ぎるとまたそれほど眠くなくなるので、ここが我慢のしどころだ。

結局土曜日も現象を捕まえることが出来ない。負荷を下げると現象が発生しないのだ。やはり、マルチスレッドの排他処理のあたりにバグが有りそうである。現象を捕まえる作業は他のグループに任せ、私はプログラムソースをチェックする。
しかし汚いソースである。こんな要となる処理の部分を、こんな汚いソースを書くやつに任せるとこういうことになるのだ、という典型例だ。
「このソース書いたやつ、至急呼んでくれませんか」
「すみません、そいつ、一週間前から連絡が取れないんですよ。逃げちゃったみたいで」
よくある話ではある。ここの部分のプログラムは、あるメーカー系のシステム子会社が請け負って、その孫受けあたりのところが作っていた。プログラマは、その孫受けの会社の社員である。
「仕方が無いですね。じゃあ我々が調べるしかないか」

土曜日の夜がやってきた。
原因はまだ分からない。どうやら、ある特定の二つのトランザクションが同時に発生すると、障害が起こるらしい、というところまでは分かってきた。しかし、それがどのトランザクションなのかはまだ分からない。
金曜日の夕方にこのビルに入ってから、一歩もここから出ていない。太陽の光も見ていない。
深夜になって、ようやく引き金となったトランザクションが特定できた。ネットワーク上のデータの流れとプロセスの動きを根気よく突き合わせていった成果だ。こういった作業は、根気とともに、ある種の推理・ひらめきというものも必要になる。いくつかの状況証拠から犯人を追いつめて行く行為というのにも、ある意味似ているかも知れない。
ここまでくればもう一息だ。デバッガを使い、プロセスの動きを追う。
ついに見つかった。排他処理が甘い。ロックをかけず共有リソースに対してアクセスしている。これでは同時にアクセスがあればおかしなことになってしまう。

日曜日の朝になっていた。
プログラムの修正は別の人間にまかせて、私は仮眠を取ることにした。
コンピュータルームにいすをならべて、その上で眠る。もう金曜日の朝から48時間以上起きていたことになる。
夢の中で私は眠っていた。夢の中で目が覚めた。どうやら家のベッドの中だ。今日は何曜日だったっけ? まあいいいや。また眠る。また目が覚める。また寝る。夢の中でそんなことを繰り返していた。眠っても、眠っても、まだ眠い。夢の中で私はそんなことを考えていた。
ダミ声が聞こえてくる。あれ? これは誰の声だったっけ? ぼんやりした頭で私は必死に考えていた。これは……これは、あの……
「おまえ、こんなところで寝ている暇があると思っているのか? システムのカットオーバーは明日だぞ。もっと真面目にやれ」
目を開けると、そこには件のバカ役員が立っていた。いかにも、私はこれからゴルフに行きます、という格好で。
私はそいつを無視して、起き上がった。状況を聞くと、プログラムの修正は終わって、単体テストも終わり、これから負荷テストを行うべく準備を行っている、とのことだった。この負荷テストが通れば、やっと開放される。視界の片隅ではバカ役員がいそいそとゴルフに向かう姿が見えた。「二度と来るな」

負荷テストの準備が意外に手間取る。一昨日からいろいろなテストをやったため、元の環境を変えてしまっているところが沢山あり、それを戻すのが大変であった。やっと負荷テストの準備が終わったのが午後の3時。
負荷テストが始まる。5分が経過する。サーバープロセスは落ちない。10分が経過する。まだ大丈夫だ。20分。順調に動いている。もう大丈夫そうである。とりあえず30分動かして問題が無ければ、テスト完了ということにする。
そう言えば、M美に電話するのをすっかり忘れていた。私は恐る恐るダイヤルする。怒っているだろうな。

30分が過ぎる。テストは無事終了する。
「お疲れさまでした」
「お疲れさま」
皆の顔に笑顔が戻る。
仕事を終えた私は、コンピュータルームのあるビルの玄関を出る。夕立があったらしい。アスファルトが濡れて、夕日を浴びて光っている。
その光の向こうにM美の姿があった。
これからM美の部屋に行こう。そんなのも、ちょっとわるくない。

[前へ] [次へ]

[Home] [戻る]


mailto:lepton@amy.hi-ho.ne.jp