Perl 在fork/execs的程序上使用Devel::NYTProf

Perl 在fork/execs的程序上使用Devel::NYTProf,perl,exec,fork,devel-nytprof,Perl,Exec,Fork,Devel Nytprof,首先,我从命令行导出PERL5OPT=-d:NYTProf,这样子进程将继承我的调试选项。然后我启动Perl程序contactd。它分叉成为一个守护进程,然后分叉/执行另一个Perl程序的九个实例,table\u manager。(exec看起来有点像exec/path/to/perl/path/to/table_manager)此时,我可以看到10或11个名为nytprof.out.nnnnnn的新文件;正如预期的那样,到目前为止,每个流程都有一个 客户机连接到contactd哪个fork/e

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

客户机连接到contactd
哪个fork/execsslave,它依次连接到九个表管理器并接受来自客户机的请求并将它们传递给九个表管理器

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

当HTML报告打开时,我看不到任何内容,除了contactd。顶部的子例程主要是开始块、导入自动加载。。。早期执行的东西

这使我认为NYTPROF正在跨越一个分支(基于多个NYTPROF.out文件),但出于某种原因,它没有继续分析exec”ed Perl程序

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


关于我没有做的事情有什么建议吗?

您可以将fork depth变量设置为-1:

深度=N

当正在分析的perl进程执行fork()时,子进程 还对该过程进行了分析。forkdepth选项可用于控制 这如果forkdepth为零,则将在中禁用评测 子进程

如果forkdepth大于零,则将在中启用评测 子进程和该进程中的forkdepth值为 减少一

如果forkdepth为-1(默认值),则该数字没有限制 一代又一代被描述的儿童


您好,

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

我不得不在不同的操作系统(CentOS)上尝试这一点,但存在一些差异。我必须显式指定addpid=1选项,以便让NYTPROF将pid附加到.out文件中。(这似乎是在我的OSX环境中自动发生的。)我得到了我想要的一切,而没有指定forkdepth=-1(这是默认值)。因此,今晚我必须在OSX上尝试这一点,看看指定addpid是否是答案,或者forkdepth是否会起作用。