mod_perl2 による高速化
mod_perl は Apache を Perl から操作するためのモジュールですが、Perl CGIを高速化するためにも利用出来ます。adiary は mod_perl2 に対応しています。Apache2.x が最大のパフォーマンスを発揮する worker MPM においても利用することができます。
(Aapache 2.x設定例) LoadModule perl_module modules/mod_perl.so <IfModule mod_perl.c> #PerlInterpStart 3 初期に起動するPerlインタプリタ数 #PerlInterpMax 5 同時処理するPerlインタプリタの最大数 #PerlInterpMinSpare 3 最小のスペア数 #PerlInterpMaxSpare 3 最大のスペア数 #PerlInterpMaxRequests 2000 いくつリクエストを受けたらインタプリタを一度終了するか PerlModule Apache2::MPM PerlSwitches -I/home/xxxx/public_html/adiary/lib PerlOptions +ParseHeaders <Directory "/home/xxxx/public_html/adiary/"> <Files ~ "\.cgi$"> SetHandler perl-script </Files> PerlResponseHandler ModPerl::Registry </Directory> </IfModule>
- adiary アップグレード時に Apacheの再起動が必要です。
- lib/ 以下のファイルを書き換えた際にApacheの再起動が必要になります。
- スケルトンファイルやconfファイルの修正では再起動不要です。
注意事項(重要)
mod_perl環境において外部データベース利用時にコネクションプールを有効にするとサーバ資源を食いつぶすことがあります。adiaryを実行するデーモンを分離するか、コネクションプールをオフにしてください。
<$DB = loadpm('DB_pg', 'database=adiary', 'adiary', 'test', 0)>
SpeedyCGI、FastCGI環境では問題ありません。
デーモンを分離する場合は、平田さんの記事「mod_perl用Apacheを分離 - Magical Diary, beta version」が大変参考になります。なおポートオーバーライドは adiary.conf.cgi で行う方が楽でしょう。
<$ENV.SERVER_PORT=80>
同時実行数をきちんと把握する
prefork MPM のとき(mod_perl1も)、同時実行数(Perlインタプリタの最大保持数)は ServerLimit により制限されます。デフォルトでは 256 です。
worker MPM のとき、同時実行数は ServerLimit と PerlInterpMax の積により制限されます。デフォルトでは「16×5=80」になります。なお PerlInterpMax を小さくするときは、同時に PerlInterpStart も小さくします。PerlInterpStart より小さな値を PerlInterpMax に設定しても無効です。
FreeBSD6.x と PostgreSQL 8.2 において、同時接続数20程度でシステムリソース*1を食いつぶしたことがあります。くれぐれもご注意ください。