Go语言的工具链对开发者非常友好,内置了很多性能调优、测试的工具,比如CPU分析器pprof、Uber开源的用于生成火焰图的go-torch、流量拷贝工具goreplay等,这些工具极大的提高了开发者效率,下面分别进行总结。
1 pprof
Go的强大之处是它已经在语言层面集成了profile采样工具,允许程序在运行时使用它们,使用Go的profiler能获取以下样本信息:
cpu profile
/debug/pprof/profile:访问这个链接会自动进行 CPU profiling,持续 30s,并生成一个文件供下载 memory profile(heap profile):报告程序内存的使用情况。
/debug/pprof/heap
block profile:报告goroutines不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈。
/debug/pprof/block
goroutine profile:报告goroutines的使用情况,有哪些goroutine,它们的调用关系是怎样的。
/debug/pprof/goroutines
net/http/pprofruntime/pprof
常用命令
- top
top 用于显示前个占用最高的函数,N –cum表示前N个累积占用CPU最高的函数。(累积,是指采样的栈里面存在这个函数,也就是它的整个子调用链的占有时间都累加起来 )
- list
list $function 可以展示这个function中每一行占用的情况。
- web
使用web可以打开一个可视化的图。
sudo apt-get install -y graphviz
如何使用
- web服务器
_ "net/http/pprof"http://local:port/debug/pprof
- 服务程序
net/http/pprofnet/http/pprof
- 应用程序
如果你的程序只是一个应用程序,比如计算fabonacci数列,对于这种情况,你需要使用runtime/pprof 。以下实例代码展示cpu和内存的profile:
注意:
./fabonacci --cpuprofile=fabnacci.profgo tool pprof fabnacci.prof
2 go-torch
go-torch是Uber公司开源的一款针对Golang程序的火焰图生成工具,能收集 stack traces,并把它们整理成火焰图,直观地程序给开发人员。go-torch是基于使用BrendanGregg创建的火焰图工具生成直观的图像,很方便地分析Go的各个方法所占用的CPU的时间。
如何安装
准备环境
注意:在终端输入flamegraph.pl -h检验是否安装FlameGraph成功
安装go-torch
常用命令
http://localhost:8080/debug/pprof/profile
- -u –url:要访问的URL,这里只是主机和端口部分(eg:http://localhost:9090)
- -s –suffix:pprof profile的路径,默认为/debug/pprof/profile
- –seconds:要执行profiling的时间长度,默认为30s
如何使用及火焰图介绍:
go-torch -u http://localhost:9090 -t 30
- y轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
- x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
- 火焰图就是看顶层的哪个函数占据的宽度最大。只要有”平顶”(plateaus),就表示该函数可能存在性能问题。
3 goreplay
gorepaly是一个开源工具,抓取生产环境流量,并使用真实流量持续测试系统。它使用raw-socket抓取系统流量,并根据指定的url,将流量进行转发。
如何安装
可以到 https://github.com/buger/gor/releases 下载特定版本及平台的二进制包,并放在可执行目录下。(当前支持的系统有 Windows, Linux x64 and Mac OS)
- linux 64位安装示例
如何使用
抓取数据包
sudo goreplay --input-raw :8080 --output-stdout
重放数据包
sudo goreplay --input-raw :8080 --output-http="http://localhost:8111"
保存以及重放
sudo gorelay --input-raw :8080 --output-file=requests.gor
重放requests.gor数据包
sudo --input-file requests.gor --output-http="http://localhost:8111"
常用命令
简单的HTTP流量复制
$ gor --input-raw :80 --output-http "http://staging.com"
HTTP流量复制频率控制(获取每秒超过10个请求)
$ gor --input-tcp :28020 --output-http "http://staging.com|10"
HTTP流量复制缩小
$ gor --input-raw :80 --output-tcp "replay.local:28020|10%"
HTTP流量记录到本地文件
$ gor --input-raw :80 --output-file requests.gor
HTTP流量回放和压测
$ gor --input-file "requests.gor|200%" --output-http "staging.com"
HTTP流量过滤复制
$ gor --input-raw :8080 --output-http staging.com --output-http-url-regexp ^www.
自定义一些流量复制的参数
$ gor --input-raw :80 --output-http 192.168.2.6:8000 --http-allow-method POST --http-set-header 'User-Agent: Gor' -output-http-workers=1 -http-allow-url test.php
将流量复制两份到不同的测试服务
$ gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com"
将流量像负载均衡一样分配到不同的服务器
$ gor --input-tcp :28020 --output-http "http://staging.com" --output-http "http://dev.com" --split-output true
本文大致对golang描述的工具链,进行总结,如有错误,欢迎指出。