go 性能分析工具 pprof

287 阅读2分钟

pprofGo 语言中分析程序运行性能的工具,它能提供各种性能数据,主要包含 runtime/pprof net/http/pprof runtime/pprof net/http/pprof 区别如下:

  • runtime/pprof 对于只跑一次的程序,例如每天只跑一次的离线预处理程序,调用 pprof 包提供的函数,手动开启性能数据采集。
  • net/http/pprof 是对 runtime/pprof 的封装,封装成接口对外提供网络访问。对于一个 HTTP 服务,访问 pprof 提供的 HTTP 接口,获得性能数据。
类型描述
allocs查看过去所有内存分配的样本
block查看导致阻塞同步的堆栈跟踪。
cmdline当前程序的命令行的完整调用路径。
goroutine查看当前所有运行的 goroutines 堆栈跟踪。
heap查看活动对象(堆)的内存分配情况。
mutex查看导致互斥锁的竞争持有者的堆栈跟踪。
profile默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件。
threadcreate查看创建新 OS 线程的堆栈跟踪。
trace跟踪程序的执行情况
package main

import (
	"math/rand"
	"os"
	"runtime/pprof"
	"time"
)

func generate(n int) []int {
	rand.Seed(time.Now().UnixNano())
	nums := make([]int, 0)
	for i := 0; i < n; i++ {
		nums = append(nums, rand.Int())
	}
	return nums
}
func bubbleSort(nums []int) {
	for i := 0; i < len(nums); i++ {
		for j := 1; j < len(nums)-i; j++ {
			if nums[j] < nums[j-1] {
				nums[j], nums[j-1] = nums[j-1], nums[j]
			}
		}
	}
}

func main() {
	pprof.StartCPUProfile(os.Stdout) // 输出文件到标准输出流或者直接创建一个文件接收数据
	defer pprof.StopCPUProfile()

	n := 10
	for i := 0; i < 5; i++ {
		nums := generate(n)
		bubbleSort(nums)
		n *= 10
	}
}

也可以执行go run main.go > cpu.pprof命令,将输出定向到文件 cpu.pprof

安装 Graphviz 官网

Graphviz(Graph Visualization Software)是一个开源的图形可视化软件,它可以将 pprof 生成的性能文件转换为我们人类可读的图形;

  1. 打开官网,找到合适的版本系统:

2、将软件安装到合适的位置,安装过程默认选项;

3、将Graphviz安装目录下的bin文件路径添加到系统环境变量中;

4、检测Graphviz是否安完成;

Graphviz使用:

//  host代表主机地址。port代表端口 source代表要打开的 .pprof 文件
go tool pprof -http=[host]:port source