pprof 是 Go 语言中分析程序运行性能的工具,它能提供各种性能数据,主要包含 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 生成的性能文件转换为我们人类可读的图形;
- 打开官网,找到合适的版本系统:
2、将软件安装到合适的位置,安装过程默认选项;
3、将Graphviz安装目录下的bin文件路径添加到系统环境变量中;
4、检测Graphviz是否安完成;
Graphviz使用:
// host代表主机地址。port代表端口 source代表要打开的 .pprof 文件
go tool pprof -http=[host]:port source