大規模な Perl アプリを高速化する必要があります。実行時間のほとんどを DB との通信に費やしていることに基づいて、適切に作成された SQL ステートメントを実行してパフォーマンス目標を達成できる数を知りたいと考えました。これを行うために、SELECT と INSERT を実行する非常に単純なハンドラーを作成しました。300 の同時要求 (合計 10,000) でベンチマークしたところ、結果は非常に貧弱でした (平均 1900 ミリ秒)。
クライアントから与えられたパフォーマンス目標は、彼らが使用する PHP で書かれた別のアプリに基づいているため、単純な mod_perl テスト ハンドラーと機能的に同じことを行う簡単な PHP スクリプトを作成したところ、平均 400 ミリ秒でした!
PHPコードは次のとおりです。
$cs = "//oracle.ourdomain.com:1521/XE";
$oc = oci_pconnect("hr","password",$cs);
if(!$oc) { print oci_error(); }
$stid = oci_parse($oc, 'SELECT id FROM zz_system_options WHERE id = 1');
oci_execute($stid);
$stmt = oci_parse($oc, "INSERT INTO zz_system_options (id,option_name) VALUES (zz_system_optionsids.nextval,'load testing')");
oci_execute($stmt);
echo "hello world";
Perl コードは次のとおりです。
use strict;
use Apache2::RequestRec ();
use Apache2::RequestIO ();
use Apache2::Const -compile => qw(:common);
use DBI;
our $dbh;
sub handler
{
my $r = shift;
# Connect to DB
$dbh = DBI->connect( "DBI:Oracle:host=oracle.ourdoamin.com;port=1521;sid=XE", "hr", "password" ) unless $dbh;
my $dbi_query_object = $dbh->prepare("SELECT id FROM zz_system_options");
$dbi_query_object->execute();
$dbi_query_object =
$dbh->prepare("INSERT INTO zz_system_options (id,option_name) VALUES (zz_system_optionsids.nextval,?)");
$dbi_query_object->execute("load testing");
# Print out some info about this...
$r->content_type('text/plain');
$r->print("Errors: $err\n");
return Apache2::Const::OK;
}
mod_perl には、「使用」されたすべてのモジュールをロードする apache 構成内の PerlRequire で呼び出される startup.pl スクリプトがあります。すべてが正常に機能し、そうでないと考える理由がない場合、各リクエストは「サブ ハンドラー」の行のみを実行する必要があります。つまり、Perl と PHP はほぼ同じことを行う必要があります。
サーバーの詳細:- ハードウェア ノードはクアッド コア Xeon L5630 @ 2.13GHz、24Gb RAM、Apache 仮想マシンの OS は Gentoo、Oracle の OS は Centos 5 です。
バージョン: 過去 2 週間以内に更新された OS、Apache バージョン 2.2.22、mod_perl バージョン 2.0.4、DBI バージョン 1.622、DBD::Oracle バージョン 1.50、Oracle インスタント クライアント バージョン 10.2.0.3、Oracle Database 10g Express Edition リリース 10.2.0.1 .0、PHP バージョン 5.3
Apache MPM 構成は、ServerLimit 2000、MaxClients 2000、および MaxRequestsPerChild 300 です。
私がチェックしたこと: テスト中、唯一の負荷はテストアプリ/オラクルからのもので、どちらの仮想マシンも Bean カウンターの制限 (メモリなど) に達しませんでした。オラクルは常に Apache の子ごとに 1 つのセッションを示しました。走る。
だから、私の質問は; mod_perl のバージョンを速くすることはできますか?