Как мне профилировать веб-приложение Perl?
Вопрос
Я работаю над веб-приложением, использующим Perl, и мне нужно подумать об ускорении некоторых частей приложения.
Я подумал, что начну составлять профили конкретных вызовов для той части, которую хочу исследовать.Я провел некоторый поиск по профилированию кода Perl, но, к сожалению, большая часть того, что я нашел, говорит о том, что мне следует запускать свой код Perl с помощью -d:DProf myapp
из командной строки.Меня это не совсем устраивает, поскольку мой код находится в веб-приложении.Я нашел способ заставить профилирование работать с Apache, но, к сожалению, «наиболее часто используемыми» модулями, которые возвращались из профилировщика, были все модули CPAN — Class::xyz и т. д. и т. п. и т. п.Не очень полезно.
Кто-нибудь знает, кроме меня, хороший способ внедрения кода «таймера» в методы, которые я хочу профилировать, чтобы нацеливаться только на эти методы?Я думал о написании тестового сценария и его профилировании, но из-за характера кода, над которым я работаю, это потребует немного больше работы, чем я надеюсь.
Решение
Попытался ли ты Разработка::NYTProf (гораздо лучше, чем Devel::DProf), который может работать под Apache?Какой веб-сервер вы используете?Это ванильный CGI-скрипт, mod_perl или что-то еще?
Если вы работаете с базами данных, DBI::Профиль может сравнить ваши запросы, что происходит в другой программе.
Однако настоящая хитрость заключается в том, чтобы организовать код так, чтобы вы могли выполнять весь спектр тестирования и профилирования без необходимости собирать все это в конце, чтобы обнаружить, что что-то работает медленно.В краткосрочной перспективе это не сильно поможет вам в борьбе с пожаром, но не позволит вещам перерасти в пожары в долгосрочной перспективе.Существуют также различные способы подделать среду веб-сервера и так далее, но это другой вопрос.:)
Другие советы
Если вы используете CGI.pm, вы можете передавать аргументы вашему Perl-скрипту в командной строке, и CGI.pm будет интерпретировать их так, как если бы они были переданы в качестве параметров через HTTP.Итак, если вы отлаживаете, например.
http://example.com/scripts/example.pl?action=browse&search=grommet&restrict=blah
тогда вы можете просто позвонить из командной строки, например.
perl -d:NYTProf корень документа/scripts/example.pl 'action=browse&search=grommet&restrict=blah'
Вы можете использовать Контрольный показатель основной модуль с :hireswalllocks вариант, если вы действительно хотите рассчитать время внутри компании.Но на самом деле у вас должна быть возможность профилировать из командной строки.Возможно, вам придется написать тестовые сценарии для эмуляции определенных частей запроса CGI, но DProf можно очень сильно полезно при поиске узких мест в производительности.
В частности, найдите, где ваш код вызывает код модуля CPAN.Возможно, вы делаете это в циклах гораздо чаще, чем необходимо, поэтому, пока вы тратите время на модуль CPAN, рефакторинг вашего кода может решить проблему.
Я понимаю, что на данный момент уже немного поздно, но это одна из причин, почему его полезно использовать. CGI::Приложение или другая архитектура, в которой веб-приложение представляет собой лишь очень краткий фрагмент веб-кода, который использует набор написанных вами модулей для реализации реальной функциональности.Использование такой конструкции позволяет очень просто профилировать (или просто тестировать) любые модули из командной строки, индивидуально или коллективно, не беспокоясь о веб-аспекте.