我有一个大型的Perl应用程序,我需要更快;在它花费大部分运行时间与DB通信的基础上,我想知道我可以运行多少编写良好的SQL语句并满足性能目标。为此,我编写了一个非常简单的处理程序,它执行SELECT和INSERT,当我对300个并发请求(总共10,000个)进行基准测试时,结果非常差(平均1900ms)。
客户端给出的性能目标是基于他们用PHP编写的另一个应用程序,因此我编写了一个快速的PHP脚本,其功能与我的简单mod_perl测试处理程序完全相同,并且平均给出了400ms !
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有一个startup.pl脚本,在apache配置中使用PerlRequire调用,该脚本加载所有'use'd模块。如果一切正常,并且我没有理由认为它不是,那么每个请求应该只运行'sub handler'中的行 - 这意味着Perl和PHP应该做的几乎相同。
服务器详细信息: - 硬件节点是四核Xeon L5630 @ 2.13GHz,带有24Gb RAM,Apache虚拟机的操作系统是Gentoo,Oracle操作系统是Centos 5 ,.
版本:操作系统在过去2周内更新,Apache版本2.2.22,mod_perl版本2.0.4,DBI版本1.622,DBD :: Oracle版本1.50,Oracle即时客户端版本10.2.0.3,Oracle数据库10g快捷版发行版10.2.0.1.0,PHP版本5.3
Apache MPM配置是ServerLimit 2000,MaxClients 2000和MaxRequestsPerChild 300
我检查过的事情:在测试期间,唯一的负载来自测试app / oracle,虚拟机都没有达到任何bean计数器限制,例如内存,Oracle每个Apache子节点始终显示1个会话,插入已经每次运行后都会完成。
所以,我的问题是;我可以更快地制作mod_perl版本吗?如果是这样的话?
答案 0 :(得分:0)
如果您更改了PHP代码并且时间没有改变那么显然您没有测量代码时间,是吗?
重要的问题是 - 为什么要反复连接Perl脚本而不是PHP脚本?
最后,除非您的所有查询都是简单的单表单行选择和插入,否则此测试可能不会告诉您任何有用的信息。