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 时间。
您的程序是否有可能通过子进程产生一些工作?这可能是解释差异的一种方式。
当我使用 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 时间。
您的程序是否有可能通过子进程产生一些工作?这可能是解释差异的一种方式。