golang火焰图
golang火焰图
1、install go-torch(火焰图)
go get -v github.com/uber/go-torch
go-torch -h
2、install FlameGraph
go get -v github.com/brendangregg/FlameGraph
cd github.com/brendangregg/FlameGraph
cp flamegraph.pl /usr/local/bin
flamegraph.pl -h
3、install graphviz
yum install graphviz
4、golang自带工具(go tool pprof)
Golang提供了 runtime/pprof和 net/http/pprof两个库来对应用进行profile进行采集。 在Golang语言中,主要关注的应用下面几个方面: * · CPU profile: 按照一定频率去采集应用程序在CPU和寄存器上面的数据 * · Memory Profile: 内存使用情况 * · Block Profile: 分析groutines的死锁等情况 * · Goroutine Profile:报告goroutines的使用情况
5、工具型的应用的pprof分析办法
对工具型的应用运行一次就结束的情况。 一般而言
在import的开头加入
"runtime/pprof"
在main方法的开头加入下面代码
//CPU
cpufile, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(cpufile)
defer func() {
pprof.StopCPUProfile()
cpufile.Close()
}()
//Mem
memfile, _ := os.Create("mem.prof")
pprof.WriteHeapProfile(memfile)
defer memfile.Close()
运行完成后即可生成 cpu.prof 和 mem.prof两个文件 运行
go tool pprof qrcode cpu.prof
(pprof) top
Showing nodes accounting for 3330ms, 78.72% of 4230ms total
Dropped 59 nodes (cum <= 21.15ms)
Showing top 10 nodes out of 95
flat flat% sum% cum cum%
780ms 18.44% 18.44% 790ms 18.68% runtime.mallocgc
620ms 14.66% 33.10% 2170ms 51.30% image.(*RGBA).Set
530ms 12.53% 45.63% 530ms 12.53% runtime.cgocall
460ms 10.87% 56.50% 550ms 13.00% compress/flate.(*compressor).deflate
230ms 5.44% 61.94% 1390ms 32.86% image/color.rgbaModel
190ms 4.49% 66.43% 1050ms 24.82% runtime.convT2Inoptr
160ms 3.78% 70.21% 1550ms 36.64% image/color.(*modelFunc).Convert
130ms 3.07% 73.29% 150ms 3.55% image/png.filter
120ms 2.84% 76.12% 120ms 2.84% runtime.memmove
110ms 2.60% 78.72% 110ms 2.60% image/color.(*Gray16).RGBA
(pprof) web
(pprof)
备注: 第1,2列是该函数在CPU上运行时间和百分比
第3列是当前所有函数累加使用CPU的比例
第4,5列是该函数和其子函数所占用的时间和比例
第6列是函数的名字。从这里我们可以大致看出来耗时的地方。
其实从web生成的svg图片也是可以调用和耗时的,比如这里较为耗时的是
image.(*RGBA).Set 耗时 0.62s
image/color.(*modelFunc).Convert 耗时0.16s
image/color.rgbaModel 耗时 0.23s
runtime.convT2Inoptr 耗时 0.19s
6、工具型的应用生成火焰图
go-torch -b cpu.prof -f cpu.svg 将svg在浏览器中就可以看到cpu.svg
火焰图怎么看懂它。主要看上面平的部分,从火焰图可以看出 compress/flate.(*compressor).deflate runtime.mallocgc image.(*RGBA).Set 这几个部分耗时是非常严重的
7、常驻后台服务的pprof性能分析和生成火焰图
在import的开头加入
_ "net/http/pprof"
在main方法的开头加入下面代码
go http.ListenAndServe("0.0.0.0:8000", nil)
直接使用工具进行分析 * go tool pprof http://0.0.0.0:8000/debug/pprof/profile
生成火焰图 * go-torch -u http://0.0.0.0:8000 -t 60