【问题标题】:pprof CPU profile of a go application does not show any samplesgo 应用程序的 pprof CPU 配置文件未显示任何示例
【发布时间】:2016-09-18 23:56:48
【问题描述】:

我正在使用 pprof 分析一个 Go 应用程序。

应用程序正在使用大约 4-10% 的 CPU,并让它运行一小会儿会产生大约 6-11kb 的配置文件。这表明它应该能够对一些活动进行采样。

但是,当我查看结果时,我看到以下内容:

$ go tool pprof --text bigproc
1.77s of 1.77s total (  100%)
      flat  flat%   sum%        cum   cum%
     1.77s   100%   100%      1.77s   100%
$

似乎缺少有趣的信息。有什么问题?

这是在 linux 上,带有 google-perftools 的 go 版本 1.6.1 和 pprof 版本 2.2.1(如果重要的话)。

【问题讨论】:

  • 您将不得不采样更长的 1.7 秒,尤其是在只有 4-10% cpu 的情况下。尝试采样几分钟。
  • 我运行这个过程大约需要一分钟的挂钟时间。我猜输出中提到的 1.77 秒是 CPU 时间,所以不包括 CPU 空闲的时间(程序被阻塞或休眠)。不过我会尝试跑更长的时间!
  • 通常在分析时强调要分析的代码路径,以便从那里获取尽可能多的样本,而不是空闲运行时。如果您只使用 4-10% 的 cpu,则 90-96% 的样本不会有任何好处。
  • 当然这是下一步,但首先我需要确定代码的哪一部分需要改进。当然,我可以做出有根据的猜测,但如果分析人员能够在进一步研究之前验证该理论,那就太好了。
  • 问题的原因在别处,但无论如何你都应该尝试增加采样时间,例如,在循环中执行几次相同的任务。

标签: performance go profiling pprof


【解决方案1】:

您误用了go tool pprof,因为您应指定与生成的配置文件关联的可执行文件。

比较一下

$ go tool pprof --text cpuprofile.prof
680ms of 680ms total (  100%)
      flat  flat%   sum%        cum   cum%
     680ms   100%   100%      680ms   100% 

有了这个(注意main,这是产生cpuprofile.prof的可执行文件)

$ go tool pprof --text main cpuprofile.prof
680ms of 680ms total (  100%)
      flat  flat%   sum%        cum   cum%
     350ms 51.47% 51.47%      610ms 89.71%  main.renderMandelbrotUnified
     130ms 19.12% 70.59%      130ms 19.12%  math.Log
      40ms  5.88% 76.47%       60ms  8.82%  image.(*RGBA).Set
[cut]

这不是错误采样的问题:考虑到每秒执行大约 100 个样本,所以即使是 1.7 秒,您也应该得到一些样本 (from here):

启用 CPU 分析后,Go 程序会停止大约 100 次 每秒并记录一个由程序计数器组成的样本 当前执行的 goroutine 的栈

【讨论】:

【解决方案2】:

有时当您的程序完成执行太快时会出现此问题。小心!

【讨论】:

    猜你喜欢
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-08
    • 2020-06-27
    • 2019-05-30
    • 2015-06-16
    • 1970-01-01
    相关资源
    最近更新 更多