[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)も検証してみたいと思います。








