[perl] mod_perlとプロセスサイズ

2009年6 月21日  |  Written by matsumoto  |  under Perl Yahoo!ブックマークに登録    はてなブックマーク - [perl] mod_perlとプロセスサイズ

mod_perlとプロセスサイズについて検証してみました。

前提

MVC(Sledge)を使って検証

TT、CGI、DateTimeなどの大きいモジュールは startup.pl でloadしています。

各Appsも File::Findで use しています。

DBをDBIx::MoCoで読み込んで、100件をTTで表示という処理を行います。

サーバーは Q6600 メモリ8G

検証結果

mod_perl1 と mod_perl2(prefork)ではスピード、メモリ消費量共にほぼ同じ。

ORマッパ(DBIx::MoCo)を抱えると大きくなる。多分CDBIとかDBICとかだと更に大きくなる。
単純な処理でも大体1プロセスサイズが50Mになる(共有メモリ含む)

各プロセスが抱えるhttpdの共有メモリはおおよそ2/3。
起動時は90%以上 → だんだんプライベートメモリが増えていきます。アプリによっては50%を切る場合もあります。

かりっかりにstartup.plで抱え込むことができれば 共有メモリ70%ぐらいで推移していきます

同じURLに対して局所的に集中するようなアクセス(F5連打など)には強いと思います。

abによるベンチでは、以下になった。それぞれでプロセス単位でのメモリの増減はあまり無いです。

DBへのアクセス無し
250 req / sec
DBへのアクセスあり(Memcached)
50 req / sec
DBへのアクセスあり
10 req / sec

結論

WebシステムはMemcachedありきが良いです。

preforkモデルでは mod_perl1 mod_perl2 共に同じでした。
趣味でどちらでもという感じです。

  • mod_extract_forwordedのバージョン違いに注意。

mod_perlはメモリを食います、メモリを多めに搭載できるサーバでないと厳しいと思います。
メモリ搭載量にもよるけど、MaxRequestPerChildは大体 100以下が現実的。

チューニング具合にもよるけど、大よそ総メモリ2G以下のシステムではSwapを起こすのでは。

Apache::Registry(ModPerl::Registory)を使っているシステムだと FastCGI、SpeedyCGIも検討の価値があると思います。

そもそもなのだけど、プログラムをメモリ上に確保するということは

システム全体のコード量が大きくなっていけばいくほど、
1プロセス辺りのメモリ消費量が増していくことになるので

「細かく異なる複数のperlモジュールが大量使われる」というシステムは
ロード&コンパイルするperlモジュールが多くなり、プロセスサイズが大きくなります。
→こういう使い方には向いてないんじゃないだろうかと・・・

シンプルなページを高速に処理するのであればとても向いているソリューションだと思います。

※Mixiは実現できているじゃないかというアレもあるのですが、どうやっているのかなあ。
URL(機能)ごとにmod_perlのサーバを分けたりしているのかな、L7バランサみたいな。
もしくは 「.pl」で終わっているURLに単純にハンドラがリライトしているだけだったりして。

ということでPHP(mod_php)も検証してみたいと思います。

現在コメントはありません | コメントの投稿はこちら

コメントを書き込む

コメント本文

※コメントのフォーム内で以下のタグがご利用いただけます
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

私はチーム・マイナス6%です