SpeedyCGIで高速化
- mod_perl プログラムの改造が必要
- FastCGI プログラムの改造が必要
- SpeedyCGI 改造は必要なし
人の作ったプログラムを改造するのには大変な労力が必要なのでSpeedyCGIを使ってみることにしました。(自分のプログラムの改造でも大変なのに)
インストール
SpeedyCGIのサイトはSpeedyCGI本家,SourceForge,SpeedyCGI日本語あたりです。
# apt-get install libperl-dev
# wget http://daemoninc.com/SpeedyCGI/CGI-SpeedyCGI-2.22.tar.gz
# tar zxf CGI-SpeedyCGI-2.22.tar.gz
# cd CGI-SpeedyCGI-2.22
# perl Makefile.PL
# make
# make test
# make install
マニュアルによると次のように1行目だけ書き換えればよいそうです。
#!/usr/bin/perl の部分を変更
↓
#!/usr/local/bin/speedy -- -t1800 -M5
これだけで動作するという話ですが、なぜか1度目はうまく動いて、2度目のメモリー上にキャッシュされたプログラムから実行するとエラーになってしまいます。どうやらキャッシュされたプログラムはrequireされた時に初期化されないようです。
一度初期化してメモリ上に置かれたら2回目は初期化なしで高速に実行できるのがSpeedyCGIの特徴なので、当たり前といえば当たり前ですね。
SimpleBoxesの改造
sb.cgi ファイル
次のように変更します。
#!/usr/local/bin/speedy -- -t1800 -M5
#
# sb - weblog management system
# == scripted by Takuya Otani ========
# == copyright (C) SimpleBoxes 2004 ==
use strict;
use vars qw($gVersion_ $gEncode $gLock_Dir $gLockFile);
use vars qw(%gIn @gIn %gData @gTemp %gEnv %gMsg $gNowTime);
use lib qw(. ./lib ./lib/lang ./ext);
require 'addlib.cgi' if (-r 'addlib.cgi');
require 'sbcommon.pl';
&sbini_first();
require 'sbtime.pl';
require 'sblang.pl';
&sblang_init();
&sblang_setup();
&sbini_main();
exit(0);
管理ツールの改造
admin.cgi ファイル
次のように書き直します。
#!/usr/local/bin/speedy -- -t3600 -M5
#
# sb - weblog management system
# == scripted by Takuya Otani ========
# == copyright (C) SimpleBoxes 2004 ==
use strict;
use vars qw($gVersion_ $gEncode $gLock_Dir $gLockFile);
use vars qw(%gIn @gIn %gData @gTemp %gEnv %gMsg $gNowTime);
use lib qw(. ./lib ./lib/lang ./ext);
require 'addlib.cgi' if (-r 'addlib.cgi');
require 'sbinit.pl';
require 'sbcommon.pl';
&sbini_first();
require 'sbtime.pl';
require 'sblang.pl';
&sblang_init();
&sblang_setup();
&sbini_second();
exit(0);
lib/sbinit.pl ファイル
36行目,37行目をコメントアウトします。
# ver 0.25 [2004/09/27] 標準テンプレートに関するバグ修正
# ver 0.26 [2004/11/26] エラー時に真っ白になってしまうバグ修正 at sbini_read_config
#require 'sbcommon.pl'; ← コメントアウト
#&sbini_second(); ← コメントアウト
}
ちょっとおかしな所もありそうですが、とりあえず動作しています。速度アップは書き込みで2倍くらい、読み込みで5倍くらいでしょうか。しかしメモリ消費量は私のマシンでは泣きそうなくらいです。
注 プラグインは、ものによっては動かなくなるようです。
コマンドライン
speedyコマンドラインは通常のperlと同じです。例外としてSpeedyCGI特有のオプションは "--"の後で渡すことができます。
例えば:
#!/usr/bin/speedy -w -- -t300
がスクリプトの先頭にあると、SpeedyCGIをperlオプション "-w"で呼び出し、 speedyに要求を受け取ってから300秒後に新しい要求がなければ終了しなさいと いう"-t"を渡します。
BackendProg
コマンドライン : -p
デフォルト値 : "/usr/bin/speedy_backend"
コンテキスト : mod_speedycgi, speedy
説明:
speedyバックエンド・プログラムへのパス
BufsizGet
コマンドライン : -B
デフォルト値 : 131072
コンテキスト : speedy
説明:
perlバックエンドからデータ受け取るバッファのための最大サイズとしてバイト使います。
BufsizPost
コマンドライン : -b
デフォルト値 : 131072
コンテキスト : speedy
説明:
perlバックエンドにデータ送るバッファのための最大サイズとしてバイト使います。
Group
コマンドライン : -g
デフォルト値 : "none"
コンテキスト : mod_speedycgi, speedy
説明:
1つのperlインタープリタが複数のスクリプトを実行することを許します。同じグループ名で、同じユーザ実行される全てのスクリプトは、同じperlインタープリタで実行されます。もしグループ名が"none"であれば、グループ化は無効になり、核インタープリタは1つのスクリプトを実行します。グループ名が違えば、スクリプトは別のグループに分けられます。名前は大文字/小文字が区別され、先頭12文字だけが有効です。空のグループ名を指定することは、グループ名"default"を指定したのと同じです - これによりグループ化を有効にするため、コマンドラインで単に"-g"を指定することが可能になります。
MaxBackends
コマンドライン : -M
デフォルト値 : 0 (上限なし)
コンテキスト : mod_speedycgi, speedy
説明:
0でなければ、このperlスクリプトのために実行するspeedyバックエンドの数をに制限します。
MaxRuns
コマンドライン : -r
デフォルト値 : 500
コンテキスト : mod_speedycgi, module, speedy
説明:
perlインタープリタが回実行したら、バックエンド・プロセスを再びexecします。0は無制限を示します。このオプションは長時間にわたってリソースを消費する傾向があるプロセスには、このオプションが有効です。
Timeout
コマンドライン : -t
デフォルト値 : 3600 (1時間)
コンテキスト : mod_speedycgi, module, speedy
説明:
たって、何も新しいリクエストを受け取らなければ、常駐perlインタープリタを終了します。0はタイムアウトなしを示します。
TmpBase
コマンドライン : -T
デフォルト値 : "/tmp/speedy"
コンテキスト : mod_speedycgi, speedy
説明:
テンポラリ・ファイルを作成するとき、与えられた文字を頭につけます。これはディレクトリ名ではなく、ファイル名の頭にならなければなりません。
Version
コマンドライン : -v
コンテキスト : speedy
説明:
SpeedyCGIのバージョンを出力し、終了します。
SpeedyCGI - CGIスクリプトを常駐させて実行することによりスピードアップさせます
参考


Comments
私はこのあと高速化に失敗しました。
(T_T)