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

huangapple go评论82阅读模式
英文:

Golang: How to get computing time using pprof within a web server

问题

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

我使用了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

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

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文件来实现这个目标?

非常感谢。

英文:

I have built a web server and did an ab(apache benchmark) test. Now I want to know the computing time of each part.

I used the go tool pprof url:port/xxx and get the profile of this program, but it does not tell me the computing time(only has memory). Following is the results:

(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

In my web program, I have added the following code:

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

but it still does not work.

I have checked http://blog.golang.org/profiling-go-programs, but the xxx.prof file confused me. How can I generate this xxx.prof file? And the author used go tool pprof xxx xxx.prof, does it mean that xxx is the binary file which generated by xxx.go?

Anyway, the target is getting the computing time, but how? Do I have to generate this xxx.prof file to achieve this goal?

Many thanks

答案1

得分: 1

我已经成功使用Dmitry在这里给出的建议: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"
)

除了"mybin"和"myserver"之外,你还需要替换你的端口号,并删除端口号后面的冒号。例如,对于我的项目,命令是:

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

然后,你将得到一个pprof存档文件,你可以通过pprof进行交互式探索,或者你可以使用外部工具 - 我个人更喜欢内置的功能。

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

英文:

I've had success using Dmitry's advice from here: https://software.intel.com/en-us/blogs/2014/05/10/debugging-performance-issues-in-go-programs

> You merely need to import net/http/pprof, and collect profiles with:
>
> $ go tool pprof --text mybin http://myserver:6060:/debug/pprof/profile

The net/http/pprof is imported solely for its side effects, so you can use

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

Aside from "mybin" and "myserver" you also need to substitute your port number in and remove the trailing colons after the port number.
E.g. for my pet project, the command is

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

You'll then get a pprof archive created which you can explore interactively through pprof, or you can use an external tool - personally I prefer the built-in capabilities.

Note that https://github.com/golang/go/issues/13841 and https://github.com/golang/go/issues/6047 are existing problems with the combination of pprof and some kernels.

huangapple
  • 本文由 发表于 2016年3月8日 14:36:51
  • 转载请务必保留本文链接:https://go.coder-hub.com/35860642.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定