Go 分析器 (pprof) 时间差异

Go profiler (pprof) timing discrepancy

当我使用 Linux 的 time 实用程序测量我的 Go 程序的 运行 时间时,我得到以下输出:

real    1m9.177s
user    7m1.788s
sys     0m39.016s

当我在 Go 的 pprof CPU 分析器中查看完全相同的程序执行的输出时,我得到以下输出:

Entering interactive mode (type "help" for commands)
(pprof) top
143.32s of 176s total (81.43%)

pprof 从哪里得到这个 176s 的数字?这既不是时钟时间也不是 CPU 时间。我正在 运行 宁这个程序 GOMAXPROCS 设置为 8,我觉得这与它有关。 pprof 究竟如何测量 运行 时间,为什么它与 linux 的 time 不同?

time 实用程序和 pprof 工具以不同的方式运行,应该以不同的方式使用。不要试图调和它们。 time 测量节目的准确时间; pprof 测量函数和方法的相对时间。 pprof是侵入式统计样本。当启用 CPU 分析时,Go 程序每秒停止大约 100 次,并在当前执行的 goroutine 堆栈上记录一个由程序计数器组成的样本。抽样是有成本的,结果是对实际人口的估计。

使用time来衡量程序的总体实际CPU时间,即绝对时间。使用 pprof 使用相对时间百分比来估计大部分时间花在函数和方法上的地方。 pprof 识别瓶颈。对于实际 CPU 次,使用 Go testing 包基准。

例如,参见 Profiling Go Programs:

By using Go's profiling tools to identify and correct specific bottlenecks, we can make the Go loop finding program run an order of magnitude faster and use 6x less memory.

这看起来像是一些错误。可能是一些已知的错误。为了输出 176s,pprof 所做的是将已知的采样周期乘以样本数。而且它应该相当准确 w.r.t。进程(系统 + 用户)花费的总 cpu 时间。

您的程序是否有可能通过子进程产生一些工作?这可能是解释差异的一种方式。