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

Posted

技术标签:

【中文标题】在 fork/execs 的程序上使用 Devel::NYTProf【英文标题】:Using Devel::NYTProf on program that fork/execs 【发布时间】:2013-02-25 02:22:33 【问题描述】:

首先我从命令行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 的新文件;正如预期的那样,对于到目前为止已经分叉的每个进程都有一个。

客户端连接到 contactd,它分叉/执行 slave,后者又连接到九个表管理器并接受来自客户端的请求并将它们传递给九个表管理器.

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

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

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

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

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

【问题讨论】:

【参考方案1】:

您可以将分叉深度变量设置为 -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(默认),则数量没有限制 被描述的几代儿童。

问候,

【讨论】:

我不得不在工作中尝试这个,在不同的操作系统(CentOS)上,有一些不同。为了让 NYTPROF 将 pid 附加到 .out 文件,我必须明确指定 addpid=1 选项。 (这似乎在我的 OSX 环境中自动发生。)我得到了我想要的一切,没有指定 forkdepth=-1 (无论如何,这是默认值)。所以我今晚必须在 OSX 上试试这个,看看是否指定 addpid 是答案,或者 forkdepth 是否有所作为。【参考方案2】:

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

【讨论】:

以上是关于在 fork/execs 的程序上使用 Devel::NYTProf的主要内容,如果未能解决你的问题,请参考以下文章

如何在“Red Hat Enterprise Linux 7.4”上安装 libyaml-devel

如何在红帽 7 上安装 python3-devel

Power8 上的 SLES 12 缺少 libuuid1-devel 包

在 rhel7 上安装 python36-devel 失败

无法在 CentOS-7 上安装 mysql-devel

linux程序名称带devel跟不带的区别