【问题标题】:How to get a function-duration breakdown in go (profiling)如何在 go (profiling) 中获得功能持续时间细分
【发布时间】:2015-02-06 10:09:25
【问题描述】:

更新(2019 年 1 月 24 日):

这个问题在 4 年前被问到关于 Go 1.4 的问题(并且仍在获得意见)。从那时起,使用 pprof 进行分析发生了巨大变化。

原问题:

我正在尝试分析我编写的基于 go martini 的服务器,我想分析单个请求,并获取函数的完整分解及其运行时持续时间。 我尝试同时使用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

我不知道差异来自哪里。

【问题讨论】:

  • 您使用什么操作系统进行分析?
  • 流浪者。我看到一些争论是否重要,但没有任何结论。我们有一个可以使用的暂存环境,但我是否采用相同的方法?
  • Vagrant 不是操作系统。您确实需要在 Linux 上进行分析,但有一个内核补丁 here 可以使其在 darwin 上运行。我仍然在 OSX 上的 VirtualBox 中使用 LInux 看到过这样的结果(不确定补丁是否有助于这种情况)
  • 您当然是对的,我的意思是如果您有任何建议,我可以设置任何我想要的东西 - Ubuntu 值得信赖。我也准备了一个旧的珍宝盒,我可以玩。
  • 哦,我错过了你的部分问题——pprof 是一个采样分析器;它不跟踪执行。您需要在负载下分析一段合理的时间才能获得一组具有代表性的样本。

标签: go profiling martini pprof


【解决方案1】:

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

此基于计时器的分析器通过使用系统分析计时器工作,并在收到SIGPROF 时记录统计信息。在运行中,当前设置为恒定的 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 设置此频率,但实际上它并没有那么有用。

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

另见:

【讨论】:

  • 我想我明白你在说什么,而且 pprof 根本不是适合我的工具,这听起来很合理。我现在只是好奇为什么我会以不同的格式获取个人资料。
  • 您必须向我们展示究竟运行了什么才能获得您的输出。您也可能使用不同版本的 pprof 工具。
  • 哦,为了完整起见,执行跟踪器正在做一些工作,它可能会落在 go1.5 中。这最终可能会给你想要的东西,甚至更多(所有这些都以漂亮的视觉格式)。
猜你喜欢
  • 2022-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-15
  • 2012-12-19
  • 2012-06-27
  • 2018-06-21
相关资源
最近更新 更多