サーバの調子が悪い

ついでに私の調子も悪くて寝てたんだけど、寝てる間に過負荷状態でハングアップしていた。

ここのサーバは、ファイルサーバ(kabigon)に全てのユーザファイルを置いて、本体のサーバ(gaien)が諸々のdaemonとかユーザプロセスを動かすような構成になっている。本体のサーバは、Xenが動いていて、2つのinstance(gaien-U1, gaien-U2)になっている。ファイルサーバはnfsになっている。

gaien-U1の方は3GBほどメモリを与えてあるのだけど、ここには約2000のユーザがいて2000ユーザ分の処理が走っている。まぁ2000と言っても生きているユーザは一握りだけだと思うけど。こっちはユーザがめいめい勝手にcgiを入れていたりする。特にquotaのようなものはかけてない。

gaien-U2の方は、会社のwebサーバうさぎSNSのサーバで、こっちは全部自分の管理下。512MBほどのinstanceで、特に問題は起きていない。

自分の管理下のDBはみんなkabigonのDB(MySQL)をアクセスするようになっているのだけど、他の人がDBを使う時にはgaien-U1のdaemonにつなぐ。nfsでDBファイルを使うのはいろいろ問題があるのだけど、移動させるのいも容易じゃないので、そのままにしている。

で、何が原因か知らないのだが、gaien-U1の方が過負荷になって死んでしまう。ユーザのcgiのほとんどは「ファイルを使う掲示板」なので、nfsの加減かなぁという気もするのだが、よくわからない。gaien <-> kabigon間はGbEでそんなに遅くもないし、ほとんどのトラフィックがhttpだとすれば、回線よりも大きなトラフィックは発生しないだろうから、多分問題なかろう。

で、普段は何事もないのだけど、ちょっとしたひょうしに、load averageが3桁とかになったりする。そんな時にはhttpdが大量にメモリを食って滞留状態になっている。swapは食い潰し。おそらくはファイルアクセスが詰まってしまっているのではないかと想像する。

nfs + Xenなんて構成に問題があるのかも知れないが、XenをXenらしく使うためには、どうやっても何らかのネットワークファイルシステムが必要になるので、どうにかしないといけない。

NBDを使おうと試してみたこともあるが、NBDは実装が甘過ぎて、ちょっと負荷をかけるとハングアップしてしまう。その時にnbdのソースを見たのだけど、「こんなに簡単に実現出来るのか」と思うと共に、「こんなにナイーブな実装だったらすぐコケるよなぁ」と思ったもの。パフォーマンスも出なさそうだ。iSCSIというアイディアもあるけど、果してどんなものか。普通のファイルシステムをiSCSIで使ったら、複数のinstanceからmountしていれば、多分片側はリードオンリーでないと問題起きそう。

世の中仮想化だXenだと喧伝されているのだが、安定させて使うのはなかなか難しいものだよ。