更新(2019年1月24日):
这个问题在4年前被问到关于Go 1.4(并且仍在获得观点)。自那时起,pprof的分析发生了巨大的变化。
原始问题:
我正在尝试分析我写的基于马提尼的go服务器,我想描述一个请求,并获得函数的完整细分及其运行时间。
我尝试使用runtime/pprof
和net/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
我无法分辨出差异来自哪里。
答案 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时间在基准测试或热循环中运行所需的代码。在累积足够的样本后,所有函数中应该有足够的数字来按比例显示每个函数花费的时间。
另见: