Perlを中心とした技術系の話などをつらつら

2004年10月22日

mod_perl使用時はMaxClientsの値に気をつけましょう

導入するだけで既存のCGIスクリプトがお手軽に10~200倍高速になるmod_perlですが、mod_perl自体がサイズがでかいのと、高速化のため、モジュールをキャッシュするため、apacheのプロセスサイズが結構大きくなってしまいます。経験的にはだいたい1プロセスあたり20~30MByte位にはなります。このような性質上、mod_perlを使う場合はメモリの使用量を考えなくてはいけません。

ところで、Apacheのデフォルトの設定ではMaxClientsの値は150に設定されています。これは同時に最大150のリクエストをさばく、つまり最大150まで子プロセスを同時に生成するということです。仮に150個の子プロセスを生成するとすると、mod_perlを利用時の1プロセスのサイズをおよそ20Mbyteとすれば20×150=3000[MByte]=3[GByte]のメモリを必要とすることになります。この場合、スワップ領域を含めてメモリの容量が3[GByte]に満たないサーバはすべてメモリを使い切り、最悪落ちることになります。

ということでほんとに落ちるかどうか実際に試してみました。 方法はApache付属のベンチマークツールabを使い同時アクセス数100、で1000回のリクエストを送るというものです。

ab -c 100 -n 1000 -k http://targetsite.hostname/
対象サーバのスペックはCPU:Pentium3の600MHz、メモリ:512MByte、スワップ領域は1GByteです。

結果はというと、、abはタイムアウトで測定不能となりました(当たり前)。さらに、ab終了後のサーバにも問題が。。サーバが落ちることはなかったんですが、abはタイムアウトで終了しているのにめちゃめちゃサーバのレスポンスが悪くなってしまいました。sshでの接続にも数十分かかる始末。やっとの事でログインし、Apacheを終了させるとようやくレスポンスが生き返りました。

結論、mod_perlを使うときはMaxClientsの値に注意しましょう。Apacheのデフォルト設定で運用すると最悪サーバが落ちます。MaxClientsの値は「サーバのメモリ容量 / Apacheの1子プロセスのサイズ」でおおざっぱに計算できます。今回試したサーバでは512/20=25位に設定しておけば、メモリを使い切ってサーバが落ちる危険がなくなります。

Technorati TAGTechnorati TAG , ,

Posted by horiuchi at 2004年10月22日 09:31

Continuing the discussion...

このエントリーのトラックバックURL:
http://hori-uchi.com/mt/trackback/210

このリストは、次のエントリーを参照しています: mod_perl使用時はMaxClientsの値に気をつけましょう:

なんかの原因でメモリを使い切ってレスポンスがむちゃくちゃ悪くなってる説。...

続きを読む: たまにサーバーが不調になる原因を探ろう

from JE no hitori chat at 2005年03月02日 12:16

Comments

Post a comment




Remember personal info?