印刷用表示へ切り替え 通常表示へ切り替え 更新履歴を表示 更新履歴を隠す
LinuxMovableType mod_persistentperl で Movable Type を高速化

mod_perl の導入が上手くいかないので,mod_persistentperl を導入して Movable Type の動作を高速化する。

■ ■ ■

Vine Linux 2.6 で mod_perl を導入したときは,Movable Type 2.661 を正常に動作させることができた (nlog(n): mod_perl で DB_File が動かない)。しかし,Vine Linux 3.2 で mod_perl を導入すると,Movable Type 2.661 の一部で正常な動作とならない。ほとんどのページの再構築には問題がないのだが,BlogTimes を含むページの再構築を行うと処理終了の応答が返って来ない。そして,GD ライブラリで描画される BlogTimes のグラフが生成されないのである。データベースは MySQL だが,Berkeley DB でも動作は同じだった。BlogTimes が呼び出している GD ライブラリと関係があるのかも知れない。

そこで,Perl モジュール PersistentPerl に付属する mod_persistentperl を使って Movable Type を高速化することにした。mod_persistentperl は,Perl スクリプトを常駐させることによって高速化させる Apache のモジュール。PersistentPerl は SpeedyCGI の後継ある。環境は Vine Linux 3.2,Apache 1.3, Movable Type 2.661,データベースは MySQL である。

導入前のベンチマークは次の通り。mt.cgi に引数なしでアクセスしているだけなので,あまり正確ではないかも知れないが,他に方法がない。

$ /usr/sbin/ab -n 100 http://nlogn.ath.cx/opentype/mt.cgi
Requests per second:    0.82 [#/sec] (mean)
Time per request:       1216.61 [ms] (mean)

1秒間に 0.82 件のリクエストを処理していて,1件あたりの処理時間は 1216.61 ms であることが分かる。

mod_persistentperl は PersistentPerl という Perl モジュールを導入すると,同時にインストールされる。インストール方法は PersistentPerl - Speed up perl scripts by running them persistently. にある (PersistentPerl - perlスクリプトを常駐させることによりスピードアップさせます に日本語化されている)。

PersistentPerl は,他の Perl モジュールと同様に CPAN からインストールすることができる。現時点での最新バージョンは PersistentPerl 2.22 である。mod_persistentperl を導入するためには apxs コマンドが必要で,Vine Linux 3.2 (RedHat 系 Linux) では apache-devel パッケージに入っている。PersistentPerl モジュールをインストールする途中で,mod_persistentperl をコンパイルするかという問合せがあるので「y」で応答する。

# cpan
cpan> install 'PersistentPerl'
...
Optional mod_persistentperl support.

Mod_persistentperl increases performance under Apache by avoiding the fork/exec
overhead associated with each request under normal PersistentPerl.  However, it
requires a working copy of "apxs" in your path, Apache with mod_so
support, and additional Apache configuration.

Compile mod_persistentperl (default no)? y
...

インストールが終了したとき,Apache のコンフィグレーションファイル /etc/httpd/conf/httpd.conf も自動的に書き換えられている。書き換え前のファイルは httpd.conf.bak に保存される。書き換えは次の2行の追加である。

LoadModule persistentperl_module lib/apache/mod_persistentperl.so
AddModule mod_persistentperl.c

この2行はコメントアウトし,次のように httpd.conf を書き換える。mod_persistentperl.so のパスを確認して変更する。基準になるパスは ServerRoot で指定されており,/etc/httpd となっているので,モジュールのインストールディレクトリ /etc/httpd/modules は「modules」から書けばよいことになる。LoadModule と AddModule の間には ClearModuleList が入るようにする。これが入らないと,/var/log/messages に「module mod_persistentperl.c is already added, skipping」という警告メッセージが記録される。

<IfDefine HAVE_PERSISTENTPERL>
LoadModule persistentperl_module modules/mod_persistentperl.so
</IfDefine>

...
ClearModuleList
...
<IfDefine HAVE_PERSISTENTPERL>
AddModule mod_persistentperl.c
</IfDefine>


...

<IfModule mod_persistentperl.c>
<Directory /home/httpd/opentype>
<Files *.cgi>
  SetHandler persistentperl-script
  Options +ExecCGI
  allow from all
</Files>
</Directory>
</IfModule>

Directory ディレクティブ内の設定により,/home/httpd/opentype ディレクトリ (Movable Type がインストールしてあるディレクトリ) の .cgi という拡張子のファイルに対して mod_persistentperl モジュールが適用される。最後の「allow from all」はなくても動作する。

PersistentPerl を使う場合,通常は CGI の先頭行を「#!/usr/bin/perl」から「#!/usr/bin/perperl」に変更するが,上記の httpd.conf の設定を行えば,mt.cgi の変更は必要ない。

動作確認は,サーバのコマンドラインから top コマンドを起動しておいて,管理画面にアクセスしたときに「perperl_backend」というプロセスが上位に来るようになっていればいいようだ。

導入後のベンチマーク結果は次のようになった。

$ /usr/sbin/ab -n 100 http://nlogn.ath.cx/opentype/mt.cgi
Requests per second:    17.06 [#/sec] (mean)
Time per request:       58.62 [ms] (mean)

1秒間に17.06件のリクエストを処理し,リクエスト1件の処理時間は 58.62 ms となった。数値的には20倍の高速化である。体感的には2倍くらいだろうか。それでもかなり効果的である。再構築の時間は変わらないが,管理画面の行き来はかなり変わるので快適になる。

アンインストールは,/etc/httpd/modules/mod_persistentperl.so を削除するだけでよい。さらに /usr/lib/perl5 の下の方にある PersistentPerl.pm も削除すれば完璧だが,これは Apache の実行には関係がないので,気にしなくてよい。また,httpd.conf は,モジュールが存在しなければロードしないように書いてあるので,特に変更の必要はない。

2008年8月1日追記:
Apache2 では mod_persistentperl が上手く動作しなかったため,mod_perl2 にしました (nlog(n): Apache2+mod_perl2 で MovableType 2.661)。

Posted by n at 2005-11-12 20:38 | Edit | Comments (0) | Trackback(0)
Trackbacks

  • 「手違いで複数トラックバックを送ってしまった!」という場合でも気にしないでください (重複分はこちらで勝手に削除させていただきます)
  • タイムアウトエラーは,こちらのサーバの処理能力不足が原因です (詳細は トラックバック送信時のエラー をご覧ください)
  • トラックバックする記事には,この記事へのリンクを含めてください(詳細は 迷惑トラックバック対策 をご覧ください)
Comments
Post a comment
  • 電子メールアドレスは必須ですが,表示されません (気になる場合は「メールアドレスのような」文字列でもOKです)
  • URL を入力した場合はリンクが張られます
  • コメント欄内ではタグは使えません
  • コメント欄内に URL を記入した場合は自動的にリンクに変換されます
  • コメント欄内の改行はそのまま改行となります
  • 「Confirmation Code」に表示されている数字を入力してください (迷惑コメント対策です)


(必須, 表示されます)


(必須, 表示されません)


(任意, リンクされます)


Confirmation Code (必須)


Remember info (R)?