前言
在做Go的性能分析调研的时候也使用到了一些压测方面的工具,go本身也给我们提供了BenchMark性能测试用例,可以很好的去测试我们的单个程序性能,比如测试某个函数,另外还有第三方包go-wrk也可以帮助我们做http接口的性能压测,今天就来介绍下这两种工具的使用。
BenchMark
BenchMark是Go的单测包testing里提供的一个压测工具类,可以帮助我们测试某个代码片段或者函数的性能,包括耗时、内存占用和内存分配的情况。
使用方法
在单元测试文件中写一个性能的单测函数,函数名必须以Benchmark开头
下面写一个测试json序列化的性能测试用例:
func BenchmarkEncodingJsonMarshal(b *testing.B) {
for i := 0; i < b.N; i++ { //固定写法,N表示随机执行多少次,多次执行可以保证测试结果的可靠性
json.Marshal(agentAggregatedDetections) //要测试的程序片段
}
}
执行结果如下:
有的时候我们测试某个函数只希望测试某个代码片段,可能就认为这里需要验证一下,这种也可以在单测里面标识,下面这个代码执行情况和上面一样
func BenchmarkEncodingJsonMarshal(b *testing.B) {
//与性能无关的代码
b.ResetTimer()
for i := 0; i < b.N; i++ {
json.Marshal(agentAggregatedDetections)
}
b.StopTimer()
//与性能无关的代码
}
上面这种方法是在编辑器里面执行的,我们也可以在命令行里面执行对应的test类,并且可以带上一些参数观察更多的信息,这个也是比较常用的方式
执行命令:
go test -bench=BenchmarkEncodingJsonMarshal //如果要执行所有的测试类下面的Benchmark函数:bench=.
辅助参数
-benchtime
- 前面的命令中我们并没有指定测试时长,因此使用的是默认值1秒,现在咱们来修改这个参数试试,毕竟1秒内完成基准测试并不是普遍适用的
- 指定基准测试时长为10秒:go test -bench=BenchmarkEncodingJsonMarshal -benchtime=10s
- 除了指定测试时长,还可以通过benchtime指定执行次数,这个次数就是我们在for循环里写的b.N这个数字,标识执行多少次循环,指定程序执行1000次:-benchtime=1000x
-count
-
count是用来控制函数的执行次数,默认是1次,这个和benchtime里面的次数不同,count是控制Benchmarkxxx函数的执行次数,benchtime是控制函数里面for循环的执行次数
go test -bench=BenchmarkEncodingJsonMarshal -count=2 -benchtime=1000x
-benchmem
-
benchmem参数可以用来查看程序在执行的时候内存使用和内存次数分配的情况
go test -bench=BenchmarkEncodingJsonMarshal -benchtime=1000x -benchmem
go-wrk
go版本的wrk工具,用来压测http接口,go-wrk本身也是一个第三方的go项目,项目地址:GitHub - adjust/go-wrk: a small heavy duty http/https benchmark tool written in go
安装go-wrk
1、下载项目到本地:git clone https://github.com/adjust/go-wrk.git
2、执行go mod init go-wrk初始化module
3、go build生成go-wrk可执行文件
使用go-wrk
压测一个go服务的http接口:go-wrk -c=400 -t=8 -n=10000 -m=GET "http://10.106.19.12:8080/performance/pertest"
命令行中的参数说明:
-H="User-Agent: go-wrk 0.1 bechmark\nContent-Type: text/html;": 由'\n'分隔的请求头
-c=100: 使用的最大连接数
-k=true: 是否禁用keep-alives
-i=false: if TLS security checks are disabled
-m="GET": HTTP请求方法
-n=1000: 请求总数
-t=1: 使用的线程数
-b="" HTTP请求体
-s="" 如果指定,它将计算响应中包含搜索到的字符串s的频率
输出结果参数说明:
Avg time per request:请求的平均响应时间
Requests per second:每秒钟处理的请求数量(QPS)
99th percentile time:接口请求耗时99线
Slowest time for request:耗时最长的请求时间