トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

SpeedyCGI

SpeedyCGI

CGIを高速化するためのモジュール。

CGIとしてはPerlを使ってますが、ApacheモジュールとしてのPHPが主流の中、CGI Perlは結構遅く感じます。
Perlの高速化にはmod_perl、FastCGI、SpeedyCGIとあるみたいすが、コードをほどんどいじらずにできるのはSpeedyCGIだけみたいなのでこれを使ってみることにします。

perldocで詳しい情報が見れます。

perldoc.jp
http://perldoc.jp/docs/modules/CGI-SpeedyCGI-2.21/SpeedyCGI.pod

ダウンロード

daemoninc.com
http://daemoninc.com/SpeedyCGI/download.html

CGI-SpeedyCGI-2.22.tar.gzが最新版。

CPANからインストールする場合

cpan install CGI::SpeedyCGI

インストール

普通はこんな感じになります。

chmod 755 CGI-SpeedyCGI-2.22.tar.gz
tar -zxvf CGI-SpeedyCGI-2.22.tar.gz
cd CGI-SpeedyCGI-2.22
perl Makefile.PL
make
make test
make install

で、

/usr/bin/speedy
/usr/bin/speedy_backend
/usr/lib/perl5/site-perl/5.8.0/CGI/SpeedyCGI.pm

あたりがインストールされます。

FSWikiで使用するには

#!/usr/bin/perl


#!/usr/bin/speedy -- -t600 -M1 -r100 -b2048000 -B2048000

みたいに設定します。

現在の設定は

-t600 600秒(10分)リクエスト無しでバックエンドを終了する
-M1 バックエンドの数は1つ
-r100 100回実行したらバックエンドを再起動する
-b2048000 perlバックエンドからデータ受け取るバッファ2048000バイト(2MB)
-B2048000 perlバックエンドにデータ送るバッファ2048000バイト(2MB)

トラブル

ryusendo.no-ip.comではredhat8を使用しています。
2.22のソースをmakeし、make testも正常に完了するのですが、WebからSpeedyが利用できない状態になりました。

以下テスト用の簡単なソース

#!/usr/bin/perl

print "content-type: text/html\n\n";
print "<html><body><h1>SpeedyCGI Test!!</h1></body></html>";

上記は当然、Webからアクセス(実行)できます。
それを

#!/usr/bin/speedy

print "content-type: text/html\n\n";
print "<html><body><h1>SpeedyCGI Test!!</h1></body></html>";

に変更し、Webからアクセスすると500エラーで

Premature end of script headers

となりました。

この手のタイプは普通

  1. #!〜の部分の間違い
  2. 文字コード(改行コード)がおかしくなった場合
  3. content-typeなど出力しなかった場合

などに発生するのですが、そもそもコマンドラインから

./test.cgi

で実行すると

content-type: text/html\n\n
<html><body><h1>SpeedyCGI Test!!</h1></body></html>

と表示され、

ps -A

で確認すると

speedy_backend

がきちんと起動している

結局どうしたかというと、RH80用のRPMを探してSpeedyCGIを入れなおしたらWebからでもOKになりました(汗)。
そのパッケージのバージョンが2.21だったのですが、2.22となにか違いがあったのかどうか...

ベンチマーク

Apacheのベンチマークとやらを試してみました。

ab -n 100 -c 10 http://ryusendo.no-ip.com/cgi-bin/fswiki/wikix.cgi

詳しくは↓

@IT Apacheパフォーマンスチューニング
http://www.atmarkit.co.jp/flinux/rensai/apache15/apache15b.html

perl/speedyリクエスト/秒
#!/usr/bin/perlRequests per second: 0.43 [#/sec] (mean)
#!/usr/bin/speedy -- -M1 -r1Requests per second: 0.50 [#/sec] (mean)
#!/usr/bin/speedy -- -M1 -r100Requests per second: 1.18 [#/sec] (mean)

感じとしては文書量が少ないページの処理速度はメチャ速くなったようですが、多いページではあまり速くなったという感じがしない(汗)。
Wiki書式の表示処理あたりが文書量に応じて増大するからか、もしくはファイルの入出力かはよくわかりません。

-Mの値を大きくすればSpeedy_backendの数を増やせて処理がリクエストが分散され、さらに高速化すると思われるのですが、ryusendoの環境だとwiki.cgiを何度か実行すると処理が戻ってこなくなるようです(汗)。

トライアル

現在、この設定でトライアル中。

#!/usr/bin/speedy_suid -- -t600 -M5 -r100 -b2048000 -B2048000

ソースがだめだったため、RPM Searchから探してきたRH80用のパッケージを使用。

RPM Search
http://rpm.pbone.net/index.php3/stat/4/idpl/2910117/com/perl-CGI-SpeedyCGI-2.21-RH80.i386.rpm.html

でパッケージの内容は

/usr/bin/speedy
/usr/bin/speedy_backend
/usr/bin/speedy_suid
/usr/lib/perl5/site_perl/5.8.0/CGI/SpeedyCGI.pm
/usr/local/bin/speedy_convert

これがopenwebmailっていうのをSpeedyCGIで走らせるためのパッケージのようで、speedy_convertはopenwebmailのスクリプトをspeedycgi用に変換するために使用するらしい。

最初は#!/usr/bin/speedyでトライアルしていたが、途中で止まったりするので#!/usr/bin/speedy_suidを使っている。
こちらはどうやら調子いい。

最終調整

#!/usr/bin/speedy -- -t600 -M1 -r0 -b2048000 -B2048000

調整といいますか、どの設定が一番いいのか様子をみていくと、Mの値を大きくすると応答がなくなります(汗)。

-M1 r0

という状態が一番いいように思う。
ちなみにr0は再起動しないという意味だが、このままリソース食いまくりってなっても困るのでt600(10分)で落とすようにした。

さて、調子がいいようならこのままいってみます。

... う〜 やっぱりダメっぽい(汗)。

#!/usr/bin/speedy -- -M1 -r0 -b2048000 -B2048000

落ちたタイミングで応答できなくなるようなので、とりあえず起動しっぱなしにしてみる。