golang性能分析工具pprof

1. pprof 介绍

profiling一般翻译为画像,在计算机性能调试领域里就是对程序应用的画像,主要指应用使用 CPU 和内存等情况。

golang自带pprof(program profile)工具可以收集并分析程序画像。

pprof读取一组profile.proto(protocol buffer格式)数据,产生可视化的数据分析报告。因此,它可以分析可以任意产生这种格式的程序,不管程序是什么语言开发的。

pprof 采样数据主要有三种获取方式:

使用pprof生产svg图时需要Graphviz工具,mac下可以通过此命令安装: brew install Graphviz

查看pprof工具的详细用法, 运行命令查看usage说明: go tool pprof

2. pprof 画像类型

如果http程序是通过添加 import _ "net/http/pprof" 支持抓取应用画像.

package main

import (
    "net/http"
    _ "net/http/pprof"
)

func main() {
    go func() {
        log.Println(http.ListenAndServe(":6060", nil))
    }()

    // business

    select {}
}

则可以通过 http://localhost:6060/debug/pprof/地址查看各种画像的样例统计数量, 并可以通过以下地址查看或下载对应的画像内容。

http://localhost:6060/debug/pprof/<PROFILE_NAME>

以上url地址中<PROFILE_NAME>参考下表:

debug参数:

gc参数: 抓取heap画像时,指定gc=1时,会先进行gc再生成heap画像;

seconds参数: 针对cpu和trace两类画像,可以通过seconds指定要抓取分析的时间周期。

3. pprof 使用经验

# pprof工具支持直接对http服务画像地址抓取并分析
go tool pprof http://localhost:6060/debug/pprof/profile?seconds=30

# 分析heap
# 1. top -cum
# 2. list github.com/vogo/logger.init
go tool pprof http://localhost:6060/debug/pprof/heap

go tool pprof --inuse_objects http://localhost:6060/debug/pprof/heap
go tool pprof --alloc_space http://localhost:6060/debug/pprof/heap
go tool pprof --alloc_objects http://localhost:6060/debug/pprof/heap


# 常常需要抓取各类profile并事后再仔细分析,这时可以先保存下profile文件,如:
curl -o cpu.prof http://localhost:6060/debug/pprof/profile?seconds=30
curl -o heap.prof http://localhost:6060/debug/pprof/heap
curl -o block.prof http://localhost:6060/debug/pprof/block
curl -o mutex.prof http://localhost:6060/debug/pprof/mutex
curl -o trace.prof http://localhost:6060/debug/pprof/trace?seconds=5

# pprof支持用http方式查看各类分析数据,而且从1.11版本开始http方式下还可以生成火焰图,更方便对程序性能进行分析:
go tool pprof -http=:8080 cpu.prof
go tool pprof -http=:8080 heap.prof
go tool pprof -http=:8080 block.prof
go tool pprof -http=:8080 mutex.prof
go tool pprof -http=:8080 trace.prof

# linux 命令查看进程信息
ps -o 'rss,vsz,pcpu,comm' -e  |grep logger
ps -o 'rss,vsz,pcpu,comm' -p 1234

4. go test bench 性能测试参数

指定测试文件生成prof文件:

go test logger_test.go logger.go --bench . -cpuprofile cpu.prof  -memprofile mem.prof -blockprofile block.prof

4. 参考