【发布时间】:2014-01-03 04:13:47
【问题描述】:
我正在 Windows 8.1 64 位上开发 Go 1.2。我在让 go pprof 工具正常工作时遇到了很多问题,例如显示内存地址而不是实际的函数名称。
但是,我发现profile 似乎在生成配置文件方面做得很好,可以与 pprof 工具一起使用。我的客人是,我如何使用这些配置文件进行图形可视化?
【问题讨论】:
我正在 Windows 8.1 64 位上开发 Go 1.2。我在让 go pprof 工具正常工作时遇到了很多问题,例如显示内存地址而不是实际的函数名称。
但是,我发现profile 似乎在生成配置文件方面做得很好,可以与 pprof 工具一起使用。我的客人是,我如何使用这些配置文件进行图形可视化?
【问题讨论】:
你可以试试go tool pprof /path/to/program profile.prof来解决function not true问题。
如果您想要图形可视化,请尝试在 pprof 中输入web。
【讨论】:
如果您的目标是看到漂亮但基本上毫无意义的图片,请按照@Specode 的建议进行可视化。
如果您的目标是速度,那么我建议您忘记可视化。 可视化不会告诉您需要修复什么。
This method does tell you what to fix. 您可以在 GDB 中非常有效地做到这一点。
编辑以回应@BurntSushi5:
这是我对图表的抱怨:)
首先,它们非常容易被愚弄。 例如,假设 A1 将所有时间都花在调用 C2 上,反之亦然。 然后假设插入了一个新的例程B,这样当A1调用B时,B调用C2,当A2调用B时,B调用C1。 该图丢失每次调用 C2 时,A1 在堆栈上位于它之上的信息,反之亦然。
再举一个例子,假设每次调用 C 都来自 A。 然后假设 A “调度”到一堆函数 B1,B2,...,每个函数都调用 C。 图丢失了每次调用 C 都来自 A 的信息。
现在到链接的图表:
它非常强调自我时间,制作巨型盒子,而包容性时间更为重要。 (事实上,发明gprof 的全部原因是因为自拍时间与只有秒针的时钟一样有用。)他们至少可以按包含时间来缩放盒子。
它没有说明调用来自的代码行,或者花费自己时间的代码行。它基于所有功能都应该很小的假设。也许这是真的,也许不是,但这是否足以成为配置文件输出无用的充分理由?
里面塞满了无关紧要的小盒子,因为它们的时间微不足道。他们所做的只是占用大量房地产并分散您的注意力。
里面没有关于 I/O 的内容。图表来自的分析器显然体现了唯一的 I/O 是必要的 I/O,因此没有必要对其进行分析(即使需要 90% 的时间)。在大型程序中,很容易完成不必要的 I/O,花费大量时间,而所谓的“CPU 分析器”有偏见,认为它甚至不存在。
该图中似乎没有任何递归实例,但递归是常见且有用的,并且图很难通过有意义的度量来显示它。
只是指出,如果取少量堆栈样本,大约一半会是这样的:
blah-blah-couldn't-read-it
blah-blah-couldn't-read-it
blah-blah-couldn't-read-it
fragbag.(*structureAtoms).BestStructureFragment
structure.RMSDMem
... a couple other routines
另一半样本正在做其他事情,同样提供信息。 由于每个堆栈示例都向您展示了调用来自的代码行,因此您实际上被告知了为什么要花费这些时间。 (不需要花费太多时间的活动被抽样的可能性很小,这很好,因为你不关心这些。)
现在我不知道这段代码,但图表让我强烈怀疑,就像我看到的很多代码一样,数据结构中有魔鬼。
【讨论】: