У меня есть большое приложение Perl, которое мне нужно сделать быстрее; на основании того, что он проводит большую часть своего времени, разговаривая с БД, я хотел бы знать, сколько хорошо написанных операторов SQL я мог запустить и выполнить целевые показатели производительности. Для этого я написал очень простой обработчик, который делает SELECT и INSERT, когда я сравнивал его по 300 одновременным запросам (всего 10 000), результаты были довольно плохими (среднее значение 1900 мс).mod_perl и oracle vs php и производительность oracle
Целевая производительность, которую мы дали клиенту, основана на другом приложении, которое они используют, написанном на PHP, поэтому я написал быстрый PHP-скрипт, который выполняет функционально то же самое, что и мой простой mod_perl-обработчик, и он дал 400 мс в среднем!
Код РНР:
$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 в апача конфигурации, который загружает все «использования d модулей. Если все работает правильно, и у меня нет оснований думать, что это не так, тогда каждый запрос должен запускать строки только в «под-обработчике» - это означает, что Perl и PHP должны делать почти то же самое.
Сведения о сервере: - Аппаратный узел представляет собой четырехъядерный процессор Xeon L5630 @ 2.13GHz с оперативной памятью 24 ГБ, ОС для виртуальной машины Apache - Gentoo, ОС для Oracle - Centos 5 ,.
Версии: ОС, обновленные за последние 2 недели, версия Apache 2.2.22, версия mod_perl 2.0.4, DBI Version 1.622, DBD :: Oracle версии 1.50, мгновенная клиентская версия Oracle 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
Вещи, которые я проверил: во время тестирования только нагрузка была из теста приложение/оракула, ни виртуального машина попала в любой из своих пределов счетчика бонусов, например, память, Oracle всегда показывала 1 сеанс на каждый ребенок Apache, вставки выполнялись после каждого запуска.
Итак, мой вопрос: Могу ли я сделать версию mod_perl быстрее, и если да, то как?
Вы должны сначала сравнить то же самое, что и ваши запросы SELECT и INSERT не совпадают между вами и PHP и вашими скриптами Perl: 'WHERE id = 1' на PHP SELECT, и вы используете _place-holder_ на Perl INSERT (_place-holder_, как известно, влияют на выступления - лучше или хуже). – Ouki
Испытание повторяется без заполнителя (отсутствующий ГДЕ был вырез и вставка из другой версии). Новый результат составляет 1810 мс для Perl - PHP так же, как неотредактированный. –
Нашли решение. В моем тестировании PHP я использовал http вместо https. Переключение на https дало очень похожие результаты Perl. Doh! –