備忘録か日記のようなもの

システム設定や日々感じたことを忘れないように

人気BLOGランキング
<< SmartVisionとLinkPlayerの連携 | main | ビデオカメラ再び >>

SpeedyCGIで高速化

 現在運営中のこのBLOGですがサーバ用のマシンが非常に非力なためBLOGの動作が遅くてたまりません。何とか高速化できないものかと検索をしていたところ 【sb】挑戦!!さくらインターネットでsbのmod_perl化 or SpeedyCGI化なる記事を見つけました。
 記事にある各種の方法を調べてみました。
  • mod_perl   プログラムの改造が必要
  • FastCGI   プログラムの改造が必要
  • SpeedyCGI  改造は必要なし

人の作ったプログラムを改造するのには大変な労力が必要なのでSpeedyCGIを使ってみることにしました。(自分のプログラムの改造でも大変なのに)

インストール
SpeedyCGIのサイトはSpeedyCGI本家SourceForgeSpeedyCGI日本語あたりです。
# 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スクリプトを常駐させて実行することによりスピードアップさせます



参考



CGI/Perl Handbook 2nd edition
関連Blog (Blogランキング)
blog | comments (1) | trackback (1)

Comments

dozo | 2005/03/16 03:34 PM
TBありがとうございます。

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

Comment Form

Trackbacks

挑戦!!さくらインターネットでsbのmod_perl化 or SpeedyCGI化 | 海は海、風は風 dozo.rgr.jp | 2005/03/16 03:33 PM
sb mod_perl で検索したところ、BUKURO-JIN が一位だった。同様にSimpleBoxes mod_perlで検索したところ、BUKURO-JIN が一位、海は海、風は風 dozo.rgr.jpが2位だった。早くもダメっぽい。(;。;)(ノ・・)ン。。。。...