over-golang/03-工程管理/06-性能测试与监控.md
2021-07-02 18:11:59 +08:00

114 lines
2.2 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 基准测试
> 基准测试用于测试一段程序的运行性能及CPU消耗
性能测试函数以 Benchmark 为名称前缀同样保存在 `*_test.go` 文件里
示例
```go
func Benchmark_Hello(b *testing.B){
// 开始测试性能相关代码
b.ResetTimer()
for i := 0; i < b.N; i++ {
// 测试代码
}
// 结束性能测试
b.StopTimer()
}
```
测试
```
go test -v -bench=Hello # -bench=.表示运行所有基准测试。win下参数为-bench="-"
```
常用参数
```
-benchmem # 显示性能具体的开销情况
-benchtime=5s # 自定义测试时间为5秒
```
## 性能监控
利用go的 `runtime/pprof` 包可以生成prof文件用来查看go代码的运行情况示例代码
```go
package main
import (
"fmt"
"os"
"runtime/pprof"
)
func slowFunc(){
str := "hello world "
for i := 0; i < 5; i++ {
str += str
}
}
func main() {
// 创建输出文件
f, err := os.Create("cpu.prof")
if err != nil {
fmt.Println("create cpu.prof err :", err)
return
}
// 获取系统信息
if err := pprof.StartCPUProfile(f); err != nil {
fmt.Println("start cpu.prof err :", err)
return
}
defer pprof.StopCPUProfile()
// 业务代码
slowFunc()
// 获取内存相关信息
f1, err := os.Create("mem.prof")
defer f1.Close()
if err != nil {
fmt.Println("create mem.prof err :", err)
return
}
// runtime.GC() // 是否获取最新的数据信息
if err := pprof.WriteHeapProfile(f1); err != nil {
fmt.Println("write cpu.prof err :", err)
return
}
// 获取协程相关信息
f2, err := os.Create("goroutine.prof")
defer f2.Close()
if err != nil {
fmt.Println("create goroutine.prof err :", err)
return
}
if gProf := pprof.Lookup("goroutine"); gProf != nil {
fmt.Println("write goroutine.prof err :", err)
return
} else {
gProf.WriteTo(f2, 0)
}
return
}
```
生成prof文件
```
# 生成程序的二进制文件
go build -o program main.go // 此时会按照代码中的要求生成多份prof文件
# 查看prof文件
go tool pprof program cpu.prof
```
贴士
- 导入 `"_ "net/http/pprof"`包还可以实现以网页形式展示prof文件内容
- 程序执行前加上环境变量可以查看GC日志`GODEBUG=gctrace=1 go run main.go`