前言
golang自带非常强大的性能分析工具,它可以在Go程序的运行中以精致的细节显示所有运行时事件,今天我们就了解一下go tool trace
的强大之处。
一、概述
go tool trace 显示了非常之多的信息,为了简单起见,我们先概括的看一下他显示了些什么,下面是我生成的所有trace目录,具体的如图上所示,我们逐个分析。
二、详细
1、view trace
打开一个view trace
,过程可能需要一点时间,稍作等待,打开之后看到的画面如下,包含一些注解:
Heap
:查看堆的使用情况,可以查看任何时刻的堆情况。下一次GC的时间,当前使用的内存情况。如下:
Threads
:当前的线程使用情况,如下图:
Proc x
:当前“核”的groutines执行情况(具体内容还没看懂什么鬼)
最右侧的统计信息:
2、Goroutine analysis
打开Goroutine analysis
看到的所有的goroutines和对应所在的模块,N表示当前模块(函数)启动的goroutines的数目,如下图:
随机点开一个,CmpServer/MyKafka.(*MyProducer).run
查看具体的信息:
3、Network blocking profile
4、Synchronization blocking profile
5、Syscall blocking profile
6、Scheduler latency profile
7、User-defined tasks
8、User-defined regions
3~8不逐个展开(还不明白流程图具体代表的什么意思)
三、go-torch性能分析
曾今对go自带的性能分析工具pprof
简单做了一些记录,文章详见 pprof性能分析1 和 pprof性能分析2 ,pprof产生的性能报告确实能够比较直观的看出来存在性能瓶颈的地方,但是对于比较大的服务来说,错综复杂的粗细线条明显能够混乱分析者的视线,这时候go-torch变体现出了他的优势。
上述一、章节中引入的pprof包是对golang自带的性能工具pprof的简单封装,通过监听本地的6060端口,生产pprof的性能文件同时也响应go-torch的指令。
1. 安装火焰图的生成工具
1)安装go-torch
工具
go get github.com/uber/go-torch
2)安装brandangregg
的火焰图生产工具
git clone git@github.com:brendangregg/FlameGraph.git
,安装完成生成工具之后,将flamegraph.h所在的目录加入到环境变量中
2. 编译并运行服务
用postman或者web页面向服务发送http://localhost:6060/start
开始采集pprof性能数据,发送http://localhost:6060/stop
停止采集pprof性能数据。在另一个shell终端上输入go-torch -u http://localhost:6060 --seconds 60 -f cpu.svg
表示开始采集cpu的性能火焰图且持续60s的时间,到达采集结束时间后生成cpu.svg的火焰图,改文件用现代浏览器打开即可查看,如下:
说明:
- 栈帧(Stack frame,调用链)垂直堆叠,显示栈的深度
- 帧的宽度代表一个方法的运行的时间占比
- 如果一个方法被调用者调用,它会显示多次,分列在不同的调用者的堆栈上。(译者注:这点和pprof工具不同,pprof至显示一个方法的框,上面的时间标签是所有的调用者调用的时间)
- 颜色是任意的(arbitrary), 横坐标根据字母顺序排列
参考:
https://blog.csdn.net/csdnnews/article/details/81009432
https://making.pusher.com/go-tool-trace/
[Go 大杀器之跟踪剖析 trace]https://eddycjy.gitbook.io/golang/di-9-ke-gong-ju/go-tool-trace
[an-introduction-to-go-tool]https://about.sourcegraph.com/go/an-introduction-to-go-tool-trace-rhys-hiltner/
[Garbage Collection In Go]https://www.ardanlabs.com/blog/2019/05/garbage-collection-in-go-part2-gctraces.html