【问题标题】:mod_perl and oracle vs php and oracle performancemod_perl 和 oracle 与 php 和 oracle 性能对比
【发布时间】:2012-08-21 17:51:07
【问题描述】:

我有一个大型 Perl 应用程序,我需要让它更快;基于它花费大部分运行时间与数据库通信,我想知道我可以运行多少编写良好的 SQL 语句并达到性能目标。为此,我编写了一个非常简单的处理程序,它执行 SELECT 和 INSERT,当我对 300 个并发请求(总共 10,000 个)进行基准测试时,结果很差(平均 1900 毫秒)。

客户端给我们的性能目标是基于他们使用的另一个用 PHP 编写的应用程序,所以我编写了一个快速的 PHP 脚本,它在功能上与我的简单 mod_perl 测试处理程序相同,平均时间为 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 有一个 startup.pl 脚本,在 apache 配置中使用 PerlRequire 调用,它加载所有“使用”的模块。如果一切正常,而且我没有理由认为它不是,那么每个请求都应该只运行“子处理程序”中的行——这意味着 Perl 和 PHP 应该做几乎相同的事情。

服务器详细信息:- 硬件节点是 Quad Core Xeon L5630 @ 2.13GHz with 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

我检查的事情:在测试期间,唯一的负载来自测试应用程序/oracle,没有一个虚拟机达到其任何 bean 计数器限制,例如内存,Oracle 始终显示每个 Apache 子节点 1 个会话,插入每次运行后完成。

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

【问题讨论】:

  • 您应该首先比较相同的东西,因为您的 SELECT 和 INSERT 查询在 PHP 和您的 Perl 脚本之间并不相同:PHP SELECT 上的WHERE id =1 并且您正在使用 place- Perl INSERT 上的持有人(已知占位符会影响性能 - 更好或更差)。
  • 没有占位符重复测试(缺少的 WHERE 是来自不同版本的剪切和粘贴)。 Perl 的新结果平均为 1810 毫秒 - PHP 与未编辑的相同。
  • 找到了解决方案。在我的 PHP 测试中,我使用了 http 而不是 https。切换到 https 与 Perl 的结果非常相似。哇!
  • @Ouki 是对的,为什么只为 PHP 选择 "WHERE id = 1" 而为 Perl 选择所有内容?

标签: php performance perl oracle mod-perl2


【解决方案1】:

如果您更改了 PHP 代码并且时间没有改变,那么显然您没有测量代码时间,是吗?

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

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

【讨论】:

  • 抱歉,我不确定我在哪里更改了 PHP 代码 - PHP 代码自始至终都是相同的(除了修复 SQL 中的差异之外,Perl 也是如此)。此外,不是 perl 中连接后的“if” - $dbh 被声明为“我们的”,因此将在对同一个 apache 子节点的请求之间共享。
  • 至于它是否告诉我任何有用的信息,它告诉我 mod_perl 比 php 慢得多,或者我的设置有误。我真的希望是后者。 '慢一点'我的意思是设置并响应我们的应用程序的请求然后有很多其他事情要做,他们可能会或可能不会在 perl/php 中更快,但 1700 奇数毫秒要做的很少是然后在其余代码中“保存”很多内容。
  • 1. “测试重复...”,2.“它告诉我...我希望” - 你在猜,这意味着它没有告诉你任何有用的信息,是吗?即使您重组了测试,这也不太可能告诉您有关您的应用程序的任何有用信息。
  • 这是对 Perl 代码而不是 PHP 的更改,但我认为您是对的;如果代码更改不会更改时间,那么它不是代码。另外,我完全同意,这告诉我对我的应用程序没有任何用处 - 但是,它告诉我在我的服务器/堆栈的设置中有一些东西导致 mod_perl 比等效慢得多。 PHP 脚本。在我对应用程序进行太多进一步工作之前,我真的很想了解或消除这种差异 - 以防我们可以进行很好的设置更改,以使我们的应用程序运行得更快,而无需更改代码!
  • 刚回去查了一下。我假设您已将占位符添加到 PHP 中。使用占位符进行测试 - 这将是查询解析/设置/发送时间的相关部分。您是否错过了我关于 php vs perl 连接数的回答?
猜你喜欢
  • 2017-10-12
  • 2011-06-21
  • 2015-01-30
  • 2010-11-10
  • 2020-10-08
  • 2011-11-04
  • 2021-10-19
  • 2010-09-27
  • 1970-01-01
相关资源
最近更新 更多