2012-08-27 2 views
0

У меня есть большое приложение 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 быстрее, и если да, то как?

+1

Вы должны сначала сравнить то же самое, что и ваши запросы SELECT и INSERT не совпадают между вами и PHP и вашими скриптами Perl: 'WHERE id = 1' на PHP SELECT, и вы используете _place-holder_ на Perl INSERT (_place-holder_, как известно, влияют на выступления - лучше или хуже). – Ouki

+0

Испытание повторяется без заполнителя (отсутствующий ГДЕ был вырез и вставка из другой версии). Новый результат составляет 1810 мс для Perl - PHP так же, как неотредактированный. –

+0

Нашли решение. В моем тестировании PHP я использовал http вместо https. Переключение на https дало очень похожие результаты Perl. Doh! –

ответ

0

Если вы изменили код PHP и время не изменилось, то ясно, что вы не измеряете время кода, не так ли?

Важный вопрос: почему вы неоднократно подключаетесь в скрипте Perl, а не в PHP-скрипте?

И, наконец, этот тест, вероятно, не даст вам ничего полезного, если все ваши запросы не являются простыми однострочными однострочными выборами и вставками.

+0

Извините, я не знаю, где я сказал, что изменил код PHP - PHP-код был одинаковым во всем (и помимо исправления различий в SQL, так что Perl). Кроме того, не «if» после подключения в perl - $ dbh объявляется как «наш», поэтому будет передаваться между запросами одному и тому же ребенку. –

+0

Что касается того, говорит ли он мне что-нибудь полезное, это говорит мне, что mod_perl медленнее, чем php, или моя настройка неправильная. Я действительно надеюсь, что это последнее. И, «медленнее», я хочу настроить и ответить на запрос нашего приложения, тогда есть много других дел, и они могут или не могут быть быстрее в perl/php, но 1700 нечетных миллисекунд, чтобы сделать очень мало достаточно много, чтобы потом «сохранить» в остальной части кода. –

+0

1. «Тест повторяется с ...», 2. «Он говорит мне либо ... Я надеюсь», - вы угадываете, а это значит, что вы не говорите ничего полезного? Даже если вы изменили свой тест, вряд ли вам скажут что-нибудь полезное о вашем заявлении. –

Смежные вопросы