FastCGIと比べて約1.4倍のスピード! 開発中のmt.psgiを使ってみた

  • Movable Type技術情報
  • 2012-04-13

管理画面や再構築のパフォーマンスが気になるMovable Typeですが、次期バージョンでは高速化を期待できそうです。


現在Movable TypeはGitHub上のオープンな環境で開発されています。
https://github.com/movabletype/movabletype


メンテナンスや新機能開発が同時進行していて現在20近いブランチがあるのですが、developブランチを眺めているとなんとmt.psgiの文字が! というわけで早速使ってみました。


結論を先に言いますと、mt.psgiは

・CGIに比べて約1.9倍
・FastCGIに比べて約1.4倍

高速化していました。


以下、インストール手順です。


調査環境

・CentOS 5.8
・Perl 5.8.8


CPANモジュールインストール

Movable Typeが動作する上記の環境に、下記のモジュールを追加でインストールしました。


・Plack
・CGI::PSGI
・CGI::Emulate::PSGI
・CGI::Compile
・SOAP::Transport::HTTP::Plack


下記コマンドでインストール可能です。


# cpanm (上記CPANモジュール名)


cpanm が無い場合は、下記コマンドでインストールしてください。


# curl -L http://cpanmin.us/ | perl - App::cpanminus


後で知ったのですが、Task::PlackでPlack関係のモジュールを一通りインストールできるようです。ただかなり時間がかかる上に、私の環境ではうまくインストール出来ず面倒そうでした。


# cpan install Task::Plack


mt-config.cgiの設定

mt.psgiを動作させるためには、事前にmt-config.cgiを作成しておく必要があります。下記の内容をmt-config.cgiに保存してください。CGIPath, StaticWebPath以外は適切に設定してください。

CGIPath /
StaticWebPath /mt-static/
StaticFilePath /var/www/html/mt_psgi/mt-static

ObjectDriver DBI::mysql
Database db_psgi
DBUser db_user
DBPass db_pass
DBHost localhost

MailTransfer sendmail
SendMailPath /usr/lib/sendmail

DefaultLanguage ja

ImageDriver ImageMagick


※DB作成は事前に行っておいてください


開発版Movable Typeのダウンロード

下記ページからzipファイルをダウンロードできます。
https://github.com/movabletype/movabletype/tree/develop


ダウンロードしたzipファイルを解凍して、サーバー上にアップロードしてください。もちろんgitコマンドでもOKです。


mt.psgi起動

下記コマンドでmt.psgiが起動します。(警告については未調査です)


# plackup mt.psgi
Use of uninitialized value in substitution (s///) at lib/MT/PSGI.pm line 237.
Use of uninitialized value in substitution (s///) at lib/MT/PSGI.pm line 238.
Use of uninitialized value in concatenation (.) or string at lib/MT/PSGI.pm line 243.
HTTP::Server::PSGI: Accepting connections at http://0:5000/


もしかすると必要モジュールが足りず、下記のようなエラーがでるかもしれません。


# plackup mt.psgi
Error while loading mt.psgi: Can't locate CGI/PSGI.pm in @INC (@INC contains: extlib lib /usr/lib/perl5/site_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/site_perl/5.8.8 /usr/lib/perl5/site_perl /usr/lib/perl5/vendor_perl/5.8.8/i386-linux-thread-multi /usr/lib/perl5/vendor_perl/5.8.8 /usr/lib/perl5/vendor_perl /usr/lib/perl5/5.8.8/i386-linux-thread-multi /usr/lib/perl5/5.8.8 .) at lib/MT/PSGI.pm line 17.
BEGIN failed--compilation aborted at lib/MT/PSGI.pm line 17.
Compilation failed in require at mt.psgi line 12.
BEGIN failed--compilation aborted at mt.psgi line 12.


その際にはモジュールの追加インストールを行ってください。上記のエラーメッセージ場合には、CGI::PSGIのインストールを行ってください。


# cpanm CGI::PSGI


Movable Typeのインストール

下記URLにアクセスすると、Movable Typeのインストールが開始します。


http://localhost:5000/mt.cgi


インストール作業は通常通り行ってください。公開先は自由に設定できるのかわかりませんでしたので、とりあえずhttp://localhost:5000/mt-static/の下に設定しました。また、私の環境ではインストール後に挙動がおかしくなったので、インストール後にmt.psgiを再起動しました。


パフォーマンス比較

CGI動作時、FastCGI動作時、psgi動作時の比較をしてみました。条件は下記の通りです。


・システム管理者
・システムダッシュボードを表示
・Firebugで計測


結果は下記の通りです。


・CGI : 1回目2.5秒 / 2回目2.36秒 / 3回目2.19秒
・FastCGI : 1回目1.69秒 / 2回目1.9秒 / 3回目1.69秒
・PSGI : 1回目1.43秒 / 2回目1.55秒 / 3回目1.31秒


PSGIで動作させると結構速くなっているようです。Firebugを見ていると静的ファイルをキャッシュしていないようでしたので、PSGIで静的ファイルはApache経由で取得するように変更して再計測してみました。


・PSGI(静的ファイルはApache経由) : 1回目1.23秒 / 2回目1.27秒 / 3回目1.2秒


更に速くなりました! CGI動作時に比べると、約2倍くらいのパフォーマンスが出ています。


使ってみた感想

簡単に使ってみましたが、特に問題は無さそうでした。個人的用途であれば実運用可能なレベルだと思います。高速化しているのはかなり嬉しいですね。ただし、FastCGI同様プラグインの有効/無効切り替えにはサーバー再起動が必要でした。


Six Apartブログの記事を見ると、developはメジャー開発用ブランチのようです。
http://blog.sixapart.jp/2012-04/movable-type-code-management.html

develop

新機能の追加を伴うメジャー開発用のコードはこのブランチで管理されます。
最新のコードを追いかける場合はこのブランチへのコミットを見ればOKです。


実験的機能はfeatureで始まるブランチで開発されているらしく、mt.psgiは将来的にリリースされそうです。いつ頃になるかはGitHubを見てもわかりませんでしたが、リリースが待ち遠しいですね。