modperl和oracle与php和oracle的性能



我有一个大型Perl应用程序,我需要更快地制作它;基于它的大部分运行时间都在与数据库对话,我想知道我可以运行多少写得很好的SQL语句并达到性能目标。为此,我编写了一个非常简单的处理程序来执行SELECT和INSERT,当我对300个并发请求(总共10000个)进行基准测试时,结果相当糟糕(平均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: $errn");
    return Apache2::Const::OK;
}

mod_perl有一个startup.pl脚本,该脚本在apache配置中使用PerlRequire调用,加载所有"used"模块。如果一切都正常工作,而我没有理由认为不是这样,那么每个请求都应该只运行"子处理程序"中的行——这意味着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 Database 10g Express Edition 10.2.0.1.0版本,PHP版本5.3

Apache MPM配置为ServerLimit 2000、MaxClients 2000和MaxRequestsPerChild 300

我检查了一下:在测试过程中,唯一的负载来自测试应用程序/oracle,两个虚拟机都没有达到任何bean计数器限制,例如内存,oracle始终显示每个Apache子级有一个会话,每次运行后都进行了插入。

所以,我的问题是;我可以让mod_perl版本更快吗?如果可以,如何?

如果您更改了PHP代码,但时间没有改变,那么很明显,您不是在测量代码时间,是吗?

重要的问题是,为什么要在Perl脚本中而不是在PHP脚本中重复连接?

最后,这个测试可能不会告诉你任何有用的东西,除非你的所有查询都是简单的单表单行选择和插入。

相关内容

  • 没有找到相关文章

最新更新