前言
在做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:耗時最長的請求時間