2015-03-31 4 views
0

Я в процессе обновления bugzilla нашей команды до последней стабильной версии. В ранее используемом Bugzilla 2.x время загрузки веб-страниц составляло около 2 секунд, которое было принято пользователями. Однако для отображения страниц Bugzilla 4.4.8 занимает от 3 до 4 секунд. Моя проблема заключается в том, что у Perl, похоже, есть проблема с импортом необходимых модулей Bugzilla.Что заставляет перл импортировать модули очень медленно?

Я сварил проблему, проверив скрипты index.cgi напрямую с помощью perl, написав testcript.cgi, который импортирует только модули Perl Bugzilla и проверяет, что вызывает длительные промежутки времени, комментируя заявления использования один за другим ,

#!/usr/bin/perl 

use strict; 
use lib qw(. lib); 
use Bugzilla; 
use Bugzilla::Constants; 
use Bugzilla::Error; 
use Bugzilla::Update; 

print "Content-Type: text/html\n\n"; 
print "<html><body>\n"; 

foreach (@INC){ 
    print "$_<br>\n"; 
} 

print "</body></html"; 

При отключении импорта Bugzilla время отклика сервера уменьшается до 50 мс. Я продолжал, сравнивая это с локальной установкой Perl/Apache/Bugzilla на своем ноутбуке: ~ 630 мс, чтобы отобразить приемлемую для меня страницу.

Возможное происхождение этого трудного поведения пришло мне в голову: что, если ему нужно пройти слишком много каталогов для модулей?

Solaris машина @INC:

. 
lib/sun4-solaris 
lib 
/opt/perl-5.20.2/lib/site_perl/5.20.2/sun4-solaris 
/opt/perl-5.20.2/lib/site_perl/5.20.2 
/opt/perl-5.20.2/lib/site_perl/sun4-solaris 
/opt/perl-5.20.2/lib/site_perl 

Notebook @INC:

. 
lib/i686-linux-gnu-thread-multi-64int 
lib 
/etc/perl 
/usr/local/lib/perl/5.18.2 
/usr/local/share/perl/5.18.2 
/usr/lib/perl5 
/usr/share/perl5 
/usr/lib/perl/5.18 
/usr/share/perl/5.18 
/usr/local/lib/site_perl 

Что вызывает это долгое время выполнения для импорта перл модулей на сервере? Как измерить время чтения ввода-вывода?

Свойства системы:

Perl 5.20.2/ Solaris 10

Update: Как было отмечено в комментариях я проанализировал сценарий с Devel :: NYTProf: Сценарий занимает большую часть времени в следующем в нескольких файлах

use Bugzilla::Install::Filesystem 
use Bugzilla::Install::Localconfig 
use Bugzilla::Install::Util 
use Bugzilla::Auth and subroutines 
use Bugzilla::User 
use Bugzilla::Template 
+0

Попробуйте ['Devel :: NYTProf'] (http://search.cpan.org/perldoc/Devel::NYTProf) – dawud

+0

Также попробуйте« Бенчмарк :: Секундомер ». –

+0

Я не понимаю, почему я должен использовать NYTProf или Секундомер сейчас, потому что уже сейчас, какие части моего кода потребляют много времени. Мой вопрос касается причины этого расширенного времени выполнения. Я думаю, что это более системный, чем perl-связанный. –

ответ

0

На самом деле это не полный ответ, но он проклят для комментариев.

То, что вы используете, по существу, является переменной PATH. При поиске пути система открывает (с opendir()) каждый каталог, затем пытается открыть/скопировать любые файлы, которые он не нашел. Это может быть менее эффективным при большом количестве больших каталогов.

Точная реализация может варьироваться в зависимости от платформы. Я видел более эффективное использование stat. Вы можете увидеть это в Solaris с фермой:

Предполагая testscript.cgi есть притон попробовать открытый системный вызов:

truss -t open testscript.cgi 

Примечание ошибки ENOENT за то, чтобы найти файлы.

Try стат

truss -t stat testscript.cgi 

Ditto на ENOENT - можно сказать stat64

Единственное решение, которое я знаю, это не большой один - создать специальный каталог. Добавьте символические ссылки в файлы pm, если нет записей заметок nomen - дубликатов для разных пакетов. Вы можете столкнуться с проблемами, если есть несколько записей, например foo.pm. В этом примере используются только записи pm. Я знакомлюсь только с perl 5.8 и ранее. Вам нужно изменить это, чтобы оно соответствовало тому, что происходит. Таким образом, @INC будет иметь базовый perl-путь и один или два специальных каталога.

И убедитесь, что ваш кеш-накопитель Solaris достаточен, прежде чем вы пройдете всю эту проблему.

Лучшее, что я могу сделать. У кого-то еще есть лучшее решение.

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