Использование 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 даже для первой записи.

Другие вопросы по тегам