Go性能测试总结
Benchmark性能测试
代码示例
在*_test.go
文件中添加Benchmark*
的函数,例如下:
运行结果
运行基准测试,结果如下:
结果详解和参数解释
-bench=
接受一个表达式,.
表示接受所有基准测试。
-8
表示GOMAXPROCS的值,20000000
表示for循环次数,71.5ns/op
表示每次循环要花费71.5纳秒,16B/op
表示每次循环需要分配的内存大小,1allocs/op
表示分配内存的次数。
默认测试时间是1s,调用了2千万次,如果想让测试时间更长,可以通过-benchtime
指定时间; 如果不想在函数中写b.ReportAllocs()
又想显示内存相关信息,那么可以加上-benchmem
显示内存信息。
例如go test -bench="." -benchmem -benchtime=3s t_test.go
更详细的分析
之前的benchmark
命令执行的结果只能看到函数的整体性能,要是函数内部比较复杂,想看更具体的内部消耗呢? 这个时候就用到了Cpu Profile
Cpu Profile
通过Cpu Profile
,可以查看内存、cpu、更底层的信息,通过这些信息就可以更好的查找性能瓶颈。
生成cpu性能描述文件的命令是go test -bench=. -cpuprofile profile_cpu.out t_test.go
,然后会生成profile_cpu.out
和xxx.test文件,这个xxx是跟你t_test.go
文件中的package名字一样。
所有的信息描述在profile_cpu.out
这个文件内,当然可以叫任何名字。
直观查看调用链
通过上面的命令,我们知道生成了profile_cpu.out
这个文件
我们想要查看详细的调用链路性能,通过svg、pdf或者png图直观查看(需要安装graphviz库),通过下面的命令生成:
|
|
Web网页形式显示(包含火焰图)
我们使用pprof
这个工具可以以网页的信息查看性能信息。
安装命令:go get github.com/google/pprof
,貌似go1.10及以后可以用go tool pprof
达到一样的效果。
下面是详细的命令例子:
接口性能测试
Vegeta
vegeta 是一个用Go语言编写的HTTP测试工具,提供了命令行和开发库。
标准输入:
-duration
测试时长,0表示永久。
-rate
每秒请求数,默认50。
目标输入为文件:
targets.txt
文件内容如下:
导出结果:
Alex
Alex 是基于vegeta lib和boom的web压测网站。
具体的的东西我已经打包成docker镜像上传了,只需要执行下面的命令:
|
|
然后访问http://localhost:8000
即可。
总结
我们可以先通过Alex或者Vegeta测试一个接口的QPS,如果感觉接口QPS不够,那么我们接下来用benchmark方案来检测具体性能。
下面是一键脚本例子:
执行上述脚本之后,访问http://localhost:10086
即可查看性能信息。