mod_perl и оракул против производительности PHP и оракула
У меня есть большое приложение на 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, который загружает все используемые модули. Если все работает правильно, и у меня нет оснований думать, что это не так, то каждый запрос должен запускать только строки в "sub handler" - это означает, что Perl и PHP должны делать почти одно и то же.
Детали сервера:- Аппаратный узел - Quad Core 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 версия 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 всегда показывал 1 сеанс на каждого дочернего элемента Apache, вставки выполнялись после каждого запустить.
Итак, мой вопрос: Могу ли я сделать версию mod_perl быстрее и если да, то как?
1 ответ
Если вы изменили код PHP, а время не изменилось, то, очевидно, вы не измеряете время кода, не так ли?
Важный вопрос - почему вы постоянно подключаетесь в скрипте Perl, а не в скрипте PHP?
Наконец, этот тест, вероятно, не скажет вам ничего полезного, если все ваши запросы не являются простыми однострочными выборками и вставками из одной таблицы.