1、Go导入pprof包的选择及go版本要求:
net/http/pprof"_ net/http/pprof""runtime/pprof"github.com/gin-contrib/pprof"github.com/gin-contrib/pprof"
2、pprof查看web服务原始状态数据
浏览器访问:http://localhost:8000/debug/pprof/,结果如图:
注意:
- 端口使用你自己web服务的监听端口号,例如我这里是:8000 端口
- 采集前需要先压测,在压测过程中才会有数据被收集
3、go tool pprof 数据图形可视化
go tool pprof
`。我这里下载的是windows-64位的版本。
- 采集前需要先压测,在压测过程中才会有数据被收集:
go get github.com/adjust/go-wrkgo-wrk -c=400 -t=8 -n=100000 http://127.0.0.1:8000/api/getReq
注意:压测试,wrk的命令行参数只能发送类似于 get、delete 这种不在请求体body中带参数的http请求。如果要发送 post 这类请求,必须要写Lua脚本。 具体可参考:wrk入门(2):发送post请求
go-wrk 压测结果如下图所示:
- 压测的同时采集数据,并生成 profile 数据分析-结果文件:
go tool pprof http://127.0.0.1:8000/debug/pprof/profilego tool pprof http://127.0.0.1:8000/debug/pprof/heapgo tool pprof http://127.0.0.1:8000/debug/pprof/goroutine
注意:
- 由提示可知,它是先将下载的原始数据保存在临时文件,然后再进一步去分析。比如图中所示的 pprof.samples.cpu.001.pb.gz
- $\color{blue}{记住关键点:不管哪种方式收集,一定是在 服务正在被压测 或者 业务逻辑正在执行的同时 启动收集}$;刚开始不熟悉流程,可能在服务都没有任何请求的时候就去收集,这是毫无意义的,也不会收集到明显的 profile 信息,可能就会像下面这样,啥数据都看不到:
- 然后会进入一个交互界面,列表中各参数代表含义如下:
flat:当前函数占用CPU的时间
flat%:当前函数占用CPU百分比
sum%:当前所有函数累加使用 CPU 的比例
cum:当前函数以及子函数占用CPU的时间
cum%:当前函数以及子函数占用CPU的百分比
另外交互界面常用命令如下:
help:命令可以提供所有pprof支持的命令说明
top 10:列出前10
web:调用 graphviz 生成svg图片并打开
list:查看具体的函数分析
pdf:命令可以生成可视化的pdf文件
tree:以树状显示
png:以图片格式输出
svg:生成浏览器可以识别的svg文件
pprof具体定位代码段示例:
此处可以通过终端交互方式来定位具体耗时较长的代码段,如下:
top5 -cumlist MyWebService/internal/app/yunapi.Router.func1
示例:当输入 web 后,会自动生成.svg文件,并在浏览器中显示可视化图形分析,如图所示:
流程图中有不同被调函数运行时长所占百分比,同时方框越大对应CPU耗时越久。不过只是这样仍然很难去分析,还有更直观的方式 ~
go tool pprof xxx-http=:8081-http localhost:8081
- linux下:
go tool pprof -http=:8081 ~/pprof/pprof.samples.cpu.001.pb.gz
- windows下路径用双反斜杠表示:
go tool pprof -http localhost:8081 C:\\Users\\xxx\\pprof\\pprof.samples.cpu.001.pb.gz
Graph图示:
火焰图:
每个方块代表一个函数,它下面一层表示这个函数会调用哪些函数,方块的大小代表了使用 CPU 所占百分比。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。
go tool pprofgo tool pprof prof
4、pprof使用方法总结:
go-wrk -c=400 -t=8 -n=100000 http://127.0.0.1:8000/api/getReqgo tool pprof http://127.0.0.1:8000/debug/pprof/profiletop10list xxxgo tool pprof xxxgo tool pprof -http=:8081 ~/pprof/pprof.samples.cpu.001.pb.gzgo tool pprof -http localhost:8081 C:\\Users\\xxx\\pprof\\pprof.samples.cpu.001.pb.gz