Golang:如何在Web服务器中使用pprof获得计算时间

时间:2016-03-08 06:36:51

标签: go pprof

我已经构建了一个Web服务器,并进行了 ab(apache benchmark)测试。现在我想知道每个部分的计算时间。

我使用了go tool pprof url:port/xxx并获取了该程序的配置文件,但它并没有告诉我计算时间(只有内存)。结果如下:

(pprof) top10
1827.59MB of 1978.12MB total (92.39%)
Dropped 175 nodes (cum <= 9.89MB)
Showing top 10 nodes out of 48 (cum >= 43.50MB)
  flat  flat%   sum%        cum   cum%
  769.54MB 38.90% 38.90%   769.54MB 38.90%  reflect.unsafe_New
  459.08MB 23.21% 62.11%   459.08MB 23.21%  services/semanticnew.TopicProbCounter.Update
  189.17MB  9.56% 71.67%  1081.21MB 54.66% github.com/golang/protobuf/proto.(*Buffer).dec_slice_struct
  122MB  6.17% 77.84%      122MB  6.17%  github.com/golang/protobuf/proto.(*Buffer).dec_int32
  107.56MB  5.44% 83.28%   107.56MB  5.44% github.com/garyburd/redigo/redis.(*conn).readReply
  68.13MB  3.44% 86.72%   527.21MB 26.65%  services/semanticnew.caculApPoiScore

  40.51MB  2.05% 88.77%    40.51MB  2.05%  runtime.malg
  28.59MB  1.45% 90.22%    28.59MB  1.45%  net/http.newBufioWriterSize
  22.50MB  1.14% 91.35%       23MB  1.16%  redismanage.(*Manager).getRequest
  20.50MB  1.04% 92.39%    43.50MB  2.20%  redismanage.(*Manager).GetRequest

在我的网络程序中,我添加了以下代码:

f, _ := os.Create("x.cpuprofile")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()

但它仍然不起作用。

我已查看http://blog.golang.org/profiling-go-programs,但xxx.prof文件让我感到困惑。如何生成此xxx.prof文件?作者使用了go tool pprof xxx xxx.prof,是否意味着xxx是由xxx.go生成的二进制文件?

无论如何,目标是获得计算时间,但是如何?我是否必须生成此xxx.prof文件才能实现此目标?

非常感谢

1 个答案:

答案 0 :(得分:1)

我在这里使用德米特里的建议取得了成功:https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs

  

您只需要导入net / http / pprof,并使用以下命令收集配置文件:

     

$ go tool pprof --text mybin http://myserver:6060:/debug/pprof/profile

net / http / pprof仅为其副作用导入,因此您可以使用

import (
   ...
   _ "net/http/pprof"
)

除了&#34; mybin&#34;和&#34; myserver&#34;您还需要在端口号后面替换您的端口号并删除尾随冒号。 例如。对于我的宠物项目,命令是

go tool pprof http://127.0.0.1:8000/debug/pprof/profile

然后您将获得一个pprof存档,您可以通过pprof以交互方式进行探索,或者您可以使用外部工具 - 我个人更喜欢内置功能。<​​/ p>

请注意,https://github.com/golang/go/issues/13841https://github.com/golang/go/issues/6047是pprof和某些内核组合存在的问题。