ネットワークインフラで使うソフトウェアの難しさ(と、楽しさ)
この二日間、一時はどうなることかという状態でしたが、種田君のがんばりにより、システムは安定稼働状態に落ち着きました。
種田君のブログにも書いてありますが、ネットワークインフラで使うソフトウェアをリリースして本番運用を始めたところ、問題が発覚したのでした。
ソフトウェアの障害で、解析が簡単なものは、「すぐに異常終了するもの」です。システム的には止まってしまうので困るのですが、異常箇所をすぐに発見できるので、対処すれば良いだけなのです。どこが悪いのかがわかれば直すのは一般的に簡単です。
大変なのは、「ごくまれにしか障害が発生しないもの」「止まるわけではないが、徐々に動きが悪くなっていくもの」です。前者は罠を仕掛けておけば障害が発生した瞬間を突き止めて、時間はかかるものの、いつかは見つけられるのですが、後者はなかなか難しいのです。
ソフトウェアの動きが悪くなっていく原因は、大抵はデータの肥大化です。メモリー消費の肥大化と考えても良いでしょう。メモリー消費量が増えると、マシン全体のパフォーマンスが落ちたり、処理自体も時間がかかるようになります。必要な分だけ肥大化しているのは、まあ仕方ないとも言えるのですが、実は必要でもないのに肥大化するタイプが問題です。
一般的に、メモリーをどんどん消費していく問題は、リーク(開放漏れ)が原因である場合がほとんどです。C言語などのようにメモリーをプログラマーが自分で管理するタイプの言語で起きやすいのですが、Javaなどのように言語側で管理するものでも、ファイルやコネクションなどのクローズ忘れなどで発生したり、あるいはガベージコレクションが追いつかなくて肥大化することもあります。
リークは問題の箇所を発見するのが難しいのですが、ツールを使って調べることもできますし、そもそも腕の良いプログラマーはきちんと構造的に作ることにより、リークが起きにくいソースを書きます。
今回の障害は、徐々にメモリー消費が肥大化していくということで、凄腕の種田君のソースとはいえ、まずはリークを疑いました。もちろん事前にツールでの試験や、長期稼働試験などで問題がないことは確認しています。それでも、本番環境では発生しているのです。自信があるはずの自分のソースが不安になるものなのです。こういうときは、ソースを眺めていてもなかなか見当がつかないのと、本番環境ではツールを使ったりすることは難しいので、以前書いたように、全てのメモリー確保・開放にログを入れ、ログ解析プログラムをその場で作って、マッチングを確認しました。すると、問題なく確保と開放はマッチングしているのです。リークはプログラム的にはないと言えそうです。
リークの問題がないということは、確保する量など、他の問題だということで、ログから、メモリー確保の回数が多く発生している部分を手がかりに、その部分のソースを見ながら、種田君と二人で、ソースを見て気がつくことを口に出し合いました。一人でやっていると思い込みで大丈夫と見過ごすことも、二人で「ああだこうだ」やっていると、「あっ!」と気付くことが多いのです。今回はあるデータ構造で、実は膨大なデータになった場合の高速化のために、あまりにもオーバーなサイズを確保していた箇所が問題だったのです。
ネットワークインフラで使うようなソフトウェアの難しさは、試験環境では本番と同じようなトラフィックを再現できない点です。できる限り、シミュレータを作ったりしてがんばりますが、本番では全国の想像もできないほど大量の端末からアクセスが集中します。「塵も積もれば山となる」で、余裕を見過ぎていた部分が掛け算されることにより、そもそもメモリーを使いすぎるプログラムになっていたのでした。
修正は一瞬なのですが、一度本番環境で問題が見つかったプログラムは入れ替えも少々面倒です。きちんと関係部署の承認を得てから、スケジュールを立てて入れ替えることになります。
無事に修正版では、大量のトラフィックが発生する時間帯でも余裕で動く状態だということを確認でき、ひとまずクローズとなりましたが、こういう状態を怖がっていたのではネットワークインフラで使うようなソフトウェアの開発は担当できません。細心の注意を払って開発・テストを行うのは当たり前ですが、それでも本番環境は想定を超えた事態が起きやすいのです。それでも立ち向かうのは・・・種田君も書いていますが、やっぱり「やりがいがあって楽しいから」なのですよねぇ。こういう苦しい経験を乗り越えながら、より高いレベルのシステムにチャレンジしていくのが楽しいのです。
著書「ルーター自作でわかるパケットの流れ」に対し、宮沢さんが盛り上げてくれるために「貴重なノウハウを簡単に公開してしまうとは・・・」と書いてくれましたが、実は技術的なことがわかったとしても、ネットワークインフラで本当に使うようなプログラムはなかなか簡単には作れないのと、作ったとしても、信じて使ってもらえる立場になることが大変なのです。本当に現場の雰囲気を経験し、痛い目にもあいながら、自分を高めていくことと、依頼者との信頼関係を築くことが必要なのです。それは本を読んでも得られないことなのです。
まあ、いずれにしても、ほっと一息ですが、今日もまた別のデータセンターでセッティングです!
それにしても、徹夜とか、帰宅できずに頑張った後に毎回感じるのが、「お風呂に入って布団に入れるというのはなんと幸せなことだろう!」ということですねぇ。。