如何在go(profiling)中获得函数持续时间细分

时间:2014-12-08 17:19:14

标签: go profiling martini pprof

更新(2019年1月24日):

这个问题在4年前被问到关于Go 1.4(并且仍在获得观点)。自那时起,pprof的分析发生了巨大的变化。

原始问题:

我正在尝试分析我写的基于马提尼的go服务器,我想描述一个请求,并获得函数的完整细分及其运行时间。 我尝试使用runtime/pprofnet/http/pprof,但输出如下:

Total: 3 samples
       1  33.3%  33.3%        1  33.3% ExternalCode
       1  33.3%  66.7%        1  33.3% runtime.futex
       1  33.3% 100.0%        2  66.7% syscall.Syscall

网页视图也不是很有帮助。

我们经常介绍另一个程序,输出似乎是我需要的:

20ms of 20ms total (  100%)
      flat  flat%  sum%        cum  cum%
      10ms 50.00% 50.00%     10ms 50.00%  runtime.duffcopy
      10ms 50.00%   100%     10ms 50.00%  runtime.fastrand1
         0     0%   100%     20ms   100%  main.func·004
         0     0%   100%     20ms   100%  main.pruneAlerts
         0     0%   100%     20ms   100%  runtime.memclr

我无法分辨出差异来自哪里。

1 个答案:

答案 0 :(得分:5)

pprof是一个基于计时器的采样分析器,最初来自gperftools套件。 Rus Cox后来将pprof工具移植到Go:http://research.swtch.com/pprof

此基于计时器的分析器使用系统分析计时器,并在收到SIGPROF时记录统计信息。在go中,目前设置为恒定的100Hz。来自pprof.go:

// The runtime routines allow a variable profiling rate,
// but in practice operating systems cannot trigger signals
// at more than about 500 Hz, and our processing of the
// signal is not cheap (mostly getting the stack trace).
// 100 Hz is a reasonable choice: it is frequent enough to
// produce useful data, rare enough not to bog down the
// system, and a nice round number to make it easy to
// convert sample counts to seconds.  Instead of requiring
// each client to specify the frequency, we hard code it.
const hz = 100

您可以通过调用runtime.SetCPUProfileRate并自行编写配置文件输出来设置此频率,而Gperftools允许您使用CPUPROFILE_FREQUENCY设置此频率,但实际上它并没有那么有用。< / p>

为了对程序进行抽样,它需要始终执行您尝试测量的内容。对空闲运行时进行采样并不会显示任何有用的内容。您通常使用尽可能多的CPU时间在基准测试或热循环中运行所需的代码。在累积足够的样本后,所有函数中应该有足够的数字来按比例显示每个函数花费的时间。

另见: