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を食いつぶしたことがあります。くれぐれもご注意ください。

*1 : kern.maxfiles