Использование Devel::NYTProf в программе, которая форк /execs
Сперва я export PERL5OPT=-d:NYTProf
из командной строки, чтобы мой вариант отладки был унаследован дочерними процессами. Затем я запускаю свою программу на Perl. Он разветвляется, чтобы стать процессом-демоном, а затем форк / исполняет девять экземпляров другой Perl-программы, table_manager. (Exec выглядит примерно так exec /path/to/perl /path/to/table_manager
.) На данный момент я вижу 10 или 11 новых файлов с именем nytprof.out. nnnn; по одному для каждого процесса, который был разбит до настоящего времени, как и ожидалось.
Клиенты подключаются к контактному серверу fork/execs, который, в свою очередь, подключается к девяти менеджерам таблиц, принимает запросы от клиента и передает их девяти менеджерам таблиц.
После запуска типичного клиентского соединения я отключил все процессы сервера. Я запускаю nytprofmerge для объединения различных nytprof.out. nnnn файлы в nytprof-merged.out, а затем запустить nytprofhtml -f nytprof-merged.out --open
,
Когда открывается отчет в формате HTML, я не вижу упоминаний ни о чем, кроме контакта. Главные подпрограммы - это, в основном, блоки BEGIN, import, AUTOLOAD... вещи раннего выполнения.
Это заставляет меня думать, что NYTPROF проходит через форк (основанный на нескольких файлах nytprof.out), но по какой-то причине не продолжает профилировать исполняемые программы Perl.
Я использую Perl 5.16.1 и последнюю версию Devel::NYTProf в MacOSX 10.8.2.
Любые предложения относительно того, что я не сделал?
2 ответа
Вы можете установить переменную глубины вилки в -1:
http://search.cpan.org/~timb/Devel-NYTProf-4.25/lib/Devel/NYTProf.pm#forkdepth=N
forkdepth = N
Когда профилируемый процесс perl выполняет fork(), дочерний процесс также профилируется. Опция forkdepth может использоваться для управления этим. Если значение forkdepth равно нулю, профилирование будет отключено в дочернем процессе.
Если значение forkdepth больше нуля, то в дочернем процессе будет включено профилирование, а значение forkdepth в этом процессе будет уменьшено на единицу.
Если значение forkdepth равно -1 (по умолчанию), то число профилируемых дочерних поколений не ограничено.
С Уважением,
AFAIU ты забыл первый nytprof.out для слияния. Вы можете объединить его или передать опцию addpid=1, чтобы всегда получать nytprof.out.nnnn даже для первой записи.