なぜホームページを作るのですか?作るだけでは終わらない千客万来亭

fastcgi と D言語

fastcgi をD言語で作って検証作業を行なっているのですが、なにやら D言語のGCに絡む問題なのか、ちょっと見逃せない現象が出ていますので紹介しておきます。

作ったのは、CGIで使われる基本的な環境変数の処理やPOSTされてきたデータの処理を行なうもの。

これを4Gのメモリを積んだマルチコア(Athlon 64 X2)の環境で、mpm-itk な apache 上で評価を行なっています。

fastcgi として作成したこのプログラムを ab コマンドを使って、-c 20 -n 10000 で走らせると、あっと言う間にメモリを食いつくしてしまうことがわかりました。

fastcgi として作成した個々のプログラムは、ほんの数パーセントのメモリしか消費していないのではありますが、これが20個のプロセスが平行して動作しているとなると大問題。

実運用するような環境だと、fastcgiなプログラムが一個だけとは限りませんし、このように簡単に数パーセントのメモリを消費してしまうようではまったく話になりません。

GCがもっと早めに回収作業を開始できるようにしてあげれば良いのかもしれませんが、今の段階でD言語で作成したプログラムの側でなんらかの対応をするのは難しいのかなと考えています。

結局fastcgi(mod_fcgid)の側の設定で、50回のリクエストでプロセスを終了させるような設定にし、今回のテストのようにアクセスが集中しているような状況であればあっと言う間に50回のリクエストを処理してしまって繰り返し終了と起動が繰り返されることを許容するようSpawnScoreUpLimitの数値を調整して対処することにしました。

これで処理速度の対CGI比の優位性を確保した上で、メモリを食い尽くす現象に対処はしましたが、こういった設定を変更してもらえないようなレンタルサーバでは、D言語でfastcgiを利用するのはほぼ不可能と言えそうな感じです。

D言語でのGCについて調べてみると、けっこうぼろかすに言われているものが多々見つかるようです。今後の改善に期待、、、というかここを直さない限りウェブのように長い間動きっぱなしになるような用途では使えないということになってしまいそうです。