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

2.2 KiB
Raw Permalink Blame History

一 基准测试

基准测试用于测试一段程序的运行性能及CPU消耗

性能测试函数以 Benchmark 为名称前缀,同样保存在 *_test.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代码的运行情况示例代码

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