5

首先,我export PERL5OPT=-d:NYTProf从命令行开始,以便我的调试选项将被子进程继承。然后我启动我的 Perl 程序contactd。它 fork 成为一个守护进程,然后 fork/execs 另一个 Perl 程序table_manager的九个实例。(exec 看起来像exec /path/to/perl /path/to/table_manager.)此时我可以看到 10 或 11 个名为nytprof.out 的新文件。nnnn ; 正如预期的那样,到目前为止已经分叉的每个进程都有一个。

客户端连接到被联系的哪个 fork/execs slave 后者又连接到九个表管理器并接受来自客户端的请求并将它们传递给九个表管理器。

运行典型的客户端连接后,我关闭了所有服务器进程。我运行nytprofmerge来合并各种nytprof.out。nnnn文件到nytprof-merged.out中,然后运行nytprofhtml -f nytprof-merged.out --open​​.

当 HTML 报告打开时,我看到除了contactd 之外没有提及任何内容。最上面的子程序主要是 BEGIN 块、importAUTOLOAD ... 早期执行的东西。

这让我认为 NYTPROF正在经历一个分叉(基于多个 nytprof.out 文件),但由于某种原因没有继续分析exec的 Perl 程序。

我在 MacOSX 10.8.2 中运行 perl 5.16.1 和最新的 Devel::NYTProf。

关于我没有做什么的任何建议?

4

2 回答 2

3

您可以将叉深度变量设置为 -1:

http://search.cpan.org/~timb/Devel-NYTProf-4.25/lib/Devel/NYTProf.pm#forkdepth=N

叉深=N

当正在分析的 perl 进程执行 fork() 时,也会分析子进程。forkdepth 选项可用于控制这一点。如果 forkdepth 为零,则在子进程中将禁用分析。

如果 forkdepth 大于零,则将在子进程中启用分析,并且该进程中的 forkdepth 值减一。

如果 forkdepth 为 -1(默认值),则对所分析的子代数没有限制。

问候,

于 2013-02-25T08:58:14.950 回答
0

AFAIU,您忘记了要合并的第一个 nytprof.out。您可以合并它,或者您可以传递 addpid=1 选项以始终获取 nytprof.out.nnnn ,即使是第一次进入也是如此。

于 2014-05-28T11:19:29.797 回答