前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >轻松入门Golang pprof实用不忽悠

轻松入门Golang pprof实用不忽悠

作者头像
李海彬
发布2019-05-08 14:15:24
1.6K0
发布2019-05-08 14:15:24
举报
文章被收录于专栏:Golang语言社区Golang语言社区

原文作者:shitaibin

来源:简书

网上已搜索golang pprof,资料不少,简明高效的一个没看到,这篇文章5步教你用会pprof获取cpu和内存prof。

第1步:安装易用的pprof golang自带的prof包是runtime/pprof,这个是低级别的,需要你手动做一些设置等等周边工作,不利于我们快速上手,利用pprof帮助我们解决实际的问题。这里推荐davecheney封装的pprof,它可以1行代码,让你用上pprof,专心解决自己的代码问题,下载:

go get github.com/pkg/profile

第2步:安装graphviz pprof生成的prof文件时二进制的,需要把这个二进制的文件转换为我们人类可读的,graphviz可以帮助我们把二进制的prof文件转换为图像。Mac安装:

brew install graphviz

其他系统安装参考这里Graphviz Download。

第3步:修改你的main函数 只需要为hi.go增加这一行,defer profile.Start().Stop(),程序运行时,默认就会记录cpu数据:

代码语言:javascript
复制
 1package main
 2
 3import (
 4    "fmt"
 5    "github.com/pkg/profile"
 6)
 7
 8func main() {
 9    defer profile.Start().Stop()
10
11    sl := makeSlice()
12    fmt.Printf("sum = %d\n", sumSlice(sl))
13}
14
15func makeSlice() []int {
16    sl := make([]int, 10000000)
17    for idx := range sl {
18        sl[idx] = idx
19    }
20    return sl
21}
22
23func sumSlice(sl []int) int {
24    sum := 0
25    for _, x := range sl {
26        sum += x
27    }
28    return sum
29}

第4步:编译运行你的函数 编译和执行hi.go。

代码语言:javascript
复制
1go build hi.go
2./hi

应当看到类似的结果,它输出了生成的cpu.pprof的路径:

代码语言:javascript
复制
12018/11/07 19:47:21 profile: cpu profiling enabled, /var/folders/5g/rz16gqtx3nsdfs7k8sb80jth0000gn/T/profile046201825/cpu.pprof
2sum = 49999995000000
32018/11/07 19:47:21 profile: cpu profiling disabled, /var/folders/5g/rz16gqtx3nsdfs7k8sb80jth0000gn/T/profile046201825/cpu.pprof

第5步:可视化prof 可视化有多种方式,可以转换为text、pdf、svg等等。text命令是

代码语言:javascript
复制
1go tool pprof --text /path/to/yourbinary /var/path/to/cpu.pprof

结果是:

代码语言:javascript
复制
 1go tool pprof -text ./hi /var/folders/5g/rz16gqtx3nsdfs7k8sb80jth0000gn/T/profile046201825/cpu.pprof
 2File: hi
 3Type: cpu
 4Time: Nov 7, 2018 at 7:47pm (CST)
 5Duration: 202.18ms, Total samples = 50ms (24.73%)
 6Showing nodes accounting for 50ms, 100% of 50ms total
 7      flat  flat%   sum%        cum   cum%
 8      40ms 80.00% 80.00%       40ms 80.00%  main.makeSlice /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go
 9      10ms 20.00%   100%       10ms 20.00%  main.sumSlice /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go
10         0     0%   100%       50ms   100%  main.main /Users/shitaibin/go/src/github.com/shitaibin/awesome/hi.go
11         0     0%   100%       50ms   100%  runtime.main /usr/local/go/src/runtime/proc.go

还有pdf这种效果更好:

代码语言:javascript
复制
1go tool pprof --pdf /path/to/yourbinary /var/path/to/cpu.pprof > cpu.pdf

例子:

代码语言:javascript
复制
1go tool pprof -pdf ./hi /var/folders/5g/rz16gqtx3nsdfs7k8sb80jth0000gn/T/profile046201825/cpu.pprof > cpu.pdf

效果:

5步已经结束,你已经学会使用cpu pprof了吗? 轻松获取内存ppfo 如果你掌握了cpu pprof,mem pprof轻而易举就能拿下,只需要改1行代码:

代码语言:javascript
复制
1defer profile.Start(profile.MemProfile).Stop()

效果:

代码语言:javascript
复制
1go tool pprof -pdf ./hi /var/folders/5g/rz16gqtx3nsdfs7k8sb80jth0000gn/T/profile986580758/mem.pprof > mem.pdf

版权申明:内容来源网络,版权归原创者所有。除非无法确认,我们都会标明作者及出处,如有侵权烦请告知,我们会立即删除并表示歉意。谢谢。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Golang语言社区 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档