by Hippo2000(2000/12/19,2001/2/7)
(2001/2/7) まこと@FESさんからの指摘を受けて1ヶ所、誤字を訂正しました。
CGI::SpeedyCGIなのです。
mod_perlと並ぶPerlによるWWWアプリケーションの高速化手法の1つです。
「CGIが遅い」というのと「Perlが遅い」というのとが区別できない人達への回答のほんの一例です。作者はSam Horroksさんです。メールで了解をいただきました。
なお内容等が間違っていたら修正します。ご連絡ください。
CGI::SpeedyCGI - CGIスクリプトを永続的に実行することによりスピードアップ
#!/usr/local/bin/speedy
### あなたのCGIスクリプトをここに
## ## オプションで、いくつかの目的のために use the CGI::SpeedyCGI モジュールを使う ##
# SpeedyCGI オブジェクトの作成 use CGI::SpeedyCGI; my $sp = CGI::SpeedyCGI->new;
# SpeedyCGIの下で実行されているかどうかを調べる print "Running under speedy=", $sp->i_am_speedy ? 'yes' : 'no', "\n";
# shutdownハンドラの設定
$sp->set_shutdown_handler(sub { do something here });
# いくつかのSpeedyCGIオプションの設定/取得
$sp->setopt('timeout', 30);
print "maxruns=", $sp->getopt('maxruns'), "\n";
SpeedyCGI はCGI perlスクリプトを永続的に実行する方法です、それは通常それらをより早く実行させます。スクリプトをSpeedyCGIを使うように変換するには、ほとんどの場合、 スクリプトの先頭にあるインタープリタの行を
#!/usr/local/bin/perl
から
#!/usr/local/bin/speedy
に変更します。
こうすると、スクリプトが初めて動くと、終了する代わりにSpeedyCGIがperlインタープリタをメモリ上で実行させたままにします。後のからの実行では、それぞれの実行のために新しいperlインタープリタを開始する代わりに、このインタープリタが新しい要求を扱うために使われます。
SpeedyCGI はCGIの仕様に従い、Webサーバーの内部で動きません。非常に速い(Cで書かれた)cgi-binが各要求のために実行されます。そしてこのcgi-binが永続Perlプロセスに接触します。それは通常既にメモリ上にあり、作業を行い、結果を返します。
これらのプロセスはWebサーバーの外側で動くので、Webサーバーそのものに障害をおこすことはできません。同様に各perlプログラムはそれ自身のUnixプロセスを実行しますので、1つのプログラムが他に影響を与えることはできません。そうでなければ永続的に実行されることを禁じるようなメモリー・リークや他の障害を持っているプログラムでコマンド行オプションを扱うこともできます。
SpeedyCGI オプションはいくつかの方法で設定することができます:
例えば:
#!/usr/local/bin/speedy -w -- -t300
がスクリプトの先頭にあると、SpeedyCGIをperlオプション "-w"で呼び出し、speedyに要求を受け取ってから300秒後に新しい要求がなければ終了しなさいと言う"-t"を渡します。
以下のオプションが利用可能です。
コマンドライン : -tN
環境変数 : SPEEDY_TIMEOUT
CGI::SpeedyCGI : TIMEOUT
mod_speedycgi : SpeedyTimeout
デフォルト値 : 3600 (1時間)
説明:
N秒後までに新しいリクエストがなければ、永続perl
インタープリタを終了させる。
0を使うとタイムアウトなしを意味する。
コマンドライン : -rN
環境変数 : SPEEDY_MAXRUNS
CGI::SpeedyCGI : MAXRUNS
mod_speedycgi : SpeedyMaxruns
デフォルト値 : 0 (つまり上限なし)
説明:
PerlインタープリタはN回実行すると、終了する。
コマンドライン : -Tstr
環境変数 : SPEEDY_TMPBASE
CGI::SpeedyCGI : n/a
mod_speedycgi : SpeedyTmpbase
デフォルト値 : /tmp/speedy
説明:
テンポラリ・ファイルを作成するために指定された接頭辞(PREFIX)を使う。
これはディレクトリ名ではなく、ファイル名の接頭辞でなければなりません。
コマンドライン : -bN
環境変数 : SPEEDY_BUFSIZ_POST
CGI::SpeedyCGI : n/a
mod_speedycgi : n/a
デフォルト値 : 1024
説明:
CGIスクリプトにデータを送るバッファのためにNバイト
使用する。
コマンドライン : -BN
環境変数 : SPEEDY_BUFSIZ_GET
CGI::SpeedyCGI : n/a
mod_speedycgi : n/a
デフォルト値 : 8192
説明:
CGIスクリプトからデータを受け取るバッファのためにNバイト
使用する。
コマンドライン : -MN
環境変数 : SPEEDY_MAXBACKENDS
CGI::SpeedyCGI : n/a
mod_speedycgi : n/a
Default Value : 0
説明:
0でなければ、speedyが与えられた時間で生成するバックエンド
プロセスの数を制限する。これは大きなperlライブラリがシステムを
Speedyがやってきたリクエストを扱うバックエンドを生成する時、
speedyプロセスの爆発がある地点までシステムを遅くさせてしまう繰り
返しを防ぐことを目指しています。
以下のメソッドがCGI::SpeedyCGIで利用することができます。
my $sp = CGI::SpeedyCGI->new;
set_shutdown_handler($function_ref)
$sp->set_shutdown_handler(sub {$dbh->logout});
$sp->i_am_speedy;
$sp->setopt('TIMEOUT', 300);
getopt($optname)
$sp->getopt('TIMEOUT');
SpeedyCGIはperl バージョン5.004_04 と 5.005_02、そしてSolaris 2.6, Redhat Linux 5.1, そして FreeBSD 3.1で試してみました。他のOSやPerlの前のバージョンでは問題があるかもしれません。
インストールするためには以下のようにします:
perl Makefile.PL
make
make test
make install
これにより"speedy"バイナリが"perl"がインストールされているところと同じディレクトリにインストールされます。オプションのApacheモジュールをインストールしたければ、apacheディレクトリにあるREADMEをご覧ください。
FreeBSDでの回避方法はカーネル設定ファイル(kernel config file)の"maxusers"値を増やし、新しいカーネルをコンパル/リンクすることです。デフォルトの値32は低すぎます− 256以上をお使いください。
speedycgi@newlug.org. 本文を"subscribe"として speedycgi-request@newlug.org にメッセージを送って参加してください。
アーカイブは http://newlug.org/mailArchive/speedycgi にあります。
SpeedyCGI は以下のところからダウンロードできます:
http://daemoninc.com/speedycgi
http://www.cpan.org/modules/by-authors/id/H/HO/HORROCKS/
Sam Horrocks
Daemon Consulting Inc.
http://daemoninc.com
sam@daemoninc.com
(原文のまま)
Copyright (c) 1999-2000 Daemon Consulting Inc. All rights reserved. This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself.
ご意見、ご質問はこちらの掲示板で受け付けています。
またメールは河馬屋(Nifty)にお願いします。