У меня есть большое приложение 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, вызываемый с помощью PerlRequire в конфигурации apache, который загружает все используемые модули. Если все работает правильно, а у меня нет причин думать, что это не так, то каждый запрос должен запускать только строки в «подобработчике» — это означает, что Perl и PHP должны делать почти одно и то же.
Сведения о сервере: Аппаратный узел представляет собой четырехъядерный процессор Xeon L5630 @ 2,13 ГГц с 24 ГБ ОЗУ, ОС для виртуальной машины Apache — Gentoo, ОС для Oracle — Centos 5.
Версии: обе ОС обновлены в течение последних 2 недель, Apache версии 2.2.22, mod_perl версии 2.0.4, DBI версии 1.622, DBD::Oracle версии 1.50, Oracle Instant Client версии 10.2.0.3, Oracle Database 10g Express Edition Release 10.2.0.1 .0, PHP версии 5.3
Конфигурация Apache MPM: ServerLimit 2000, MaxClients 2000 и MaxRequestsPerChild 300.
Что я проверил: во время тестирования единственная нагрузка была от тестового приложения/оракула, ни одна виртуальная машина не превышала ни одного из своих ограничений счетчика bean-компонентов, например, памяти, Oracle всегда показывал 1 сеанс на дочерний элемент Apache, вставки выполнялись после каждого бегать.
Итак, мой вопрос; Могу ли я сделать версию mod_perl быстрее, и если да, то как?
WHERE id =1
в PHP SELECT и вы используете заполнители в Perl INSERT ( Известно, что заполнители влияют на производительность — лучше или хуже). - person Ouki   schedule 27.08.2012