4  fprof - 文件跟踪分析器

4 fprof - 文件跟踪分析器

fprof 是一种分析工具,可用于了解不同函数消耗了多少处理时间以及它们在哪些进程中运行。

fprof 使用带有时间戳的跟踪来收集分析数据。因此,无需对要分析的任何模块进行特殊编译。

fprof 显示来自主机操作系统的时间戳,并假设操作系统调度会以公平的方式随机加载被分析函数。自身时间,即函数用于自身执行的时间,以及累积时间,即包括被调用函数的执行时间。

分析主要分为 3 个步骤

跟踪;如前一段所述,跟踪到文件。
分析;读取跟踪文件并将原始分析数据收集到节点上的内部 RAM 存储器中。在此步骤中,跟踪数据可以以文本格式转储到文件或控制台。
分析;对原始分析数据进行排序,并以文本格式转储到文件或控制台。

由于 fprof 使用跟踪到文件,因此运行时性能下降被降至最低,但仍然远非微不足道,尤其对于自身大量使用文件系统的程序而言。跟踪文件放置的位置也很重要,例如,在 Solaris 上,/tmp 通常是一个不错的选择,而任何 NFS 挂载的磁盘都是一个糟糕的选择。

Fprof 还可以跳过文件步骤,并将跟踪数据发送到它自己的跟踪器进程,该进程在运行时执行分析。

以下部分展示了使用 Fprof 进行分析的一些示例。另请参阅参考手册 fprof(3)

如果可以编辑和重新编译源代码,则可以在要分析的代码之前和之后插入 fprof:trace(start)fprof:trace(stop)。所有生成的进程也将被跟踪。如果希望使用与默认文件名不同的文件名,请尝试 fprof:trace(start, "my_fprof.trace")

然后读取跟踪文件并使用 fprof:profile() 创建原始分析数据,或者对于非默认文件名,可以使用 fprof:profile(file, "my_fprof.trace")

最后,使用 fprof:analyse() 在控制台上创建一个信息表,或者使用 fprof:analyse(dest, []) 在文件中创建一个信息表,甚至可以尝试 fprof:analyse([{dest, "my_fprof.analysis"}, {cols, 120}]),以在非默认文件名上创建更宽的列表。

有关函数 traceprofileanalyse 的更多选项和参数,请参阅 fprof(3) 手册页。

如果有一个函数执行了要分析的任务,并且该函数在分析结束时返回,则使用 fprof:apply(Module, Function, Args) 及其相关函数执行跟踪步骤非常方便。

如果跟踪应该在函数返回后继续,例如,如果它是一个启动函数,会生成要分析的进程,则可以使用 fprof:apply(M, F, Args, [continue | OtherOpts])。必须在适当的稍后时间使用 fprof:trace(stop) 停止跟踪。

还可以立即跟踪到创建原始分析数据的分析进程中,即将跟踪和分析步骤短路,这样就不会使用文件系统。

执行以下操作

{ok, Tracer} = fprof:profile(start),
fprof:trace([start, {tracer, Tracer}]),
%% Code to profile
fprof:trace(stop);

这会减少对文件系统的负载,但会增加对 Erlang 运行时系统的负载。