Golang 大杀器之性能剖析 PProf

2023-08-28 18:05:58 阅读:803 评论:0 点赞:0
所属分类: Go 语言学习笔记

runtime/pprof 采集程序(非 Server)的运行数据进行分析
net/http/pprof 采集 HTTP Server 的运行时数据进行分析

pprof 是用于可视化和分析性能分析数据的工具,pprof 以 profile.proto 读取分析样本的集合,并生成报告以可视化并帮助分析数据(支持文本和图形报告)

profile.proto 是一个 Protocol Buffer v3 的描述文件,它描述了一组 callstacksymbolization 信息, 作用是表示统计分析的一组采样的调用栈,是很常见的 stacktrace 配置文件格式。

可用模式
报告生成、交互式终端使用、Web 界面

分析指标

  • CPU 分析(CPU Profiling),按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置。

  • 内存分析(Memory Profiling),在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏。

  • 阻塞分析(Block Profiling),记录 goroutine 阻塞等待同步(包括定时器通道)的位置。

  • 互斥锁分析(Mutex Profiling),报告互斥锁的竞争情况。

一个简单的例子

demo.go

package main

import (
    "log"
    "net/http"
    _ "net/http/pprof"
    "github.com/EDDYCJY/go-pprof-example/data"
)

func main() {
    go func() {
        for {
            log.Println(data.Add("https://github.com/EDDYCJY"))
        }
    }()

    http.ListenAndServe("0.0.0.0:8080", nil)
}

data/d.go

package data

var datas []string

func Add(str string) string {
    data := []byte(str)
    sData := string(data)
    datas = append(datas, sData)

    return sData
}

我们启动这个 WEB 服务后,会多出一个接口 /debug/pprof 我们可以访问:
4cf20b8d-83de-477c-811a-c7e6c5b63913

  • cpu(CPU Profiling): $HOST/debug/pprof/profile,默认进行 30s 的 CPU Profiling,得到一个分析用的 profile 文件
  • block(Block Profiling):$HOST/debug/pprof/block,查看导致阻塞同步的堆栈跟踪
  • goroutine:$HOST/debug/pprof/goroutine,查看当前所有运行的 goroutines 堆栈跟踪
  • heap(Memory Profiling): $HOST/debug/pprof/heap,查看活动对象的内存分配情况
  • mutex(Mutex Profiling):$HOST/debug/pprof/mutex,查看导致互斥锁的竞争持有者的堆栈跟踪
  • threadcreate:$HOST/debug/pprof/threadcreate,查看创建新OS线程的堆栈跟踪

终端交互式

go tool pprof http://localhost:6060/debug/pprof/profile\?seconds\=60

执行该命令后,需等待 60 秒(可调整 seconds 的值),pprof 会进行 CPU Profiling。结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help 查看命令说明。
1f90aa38-b436-49f2-8a50-e249396b4fc4
flat:给定函数上运行耗时
flat%:同上的 CPU 运行耗时总比例
sum%:给定函数累积使用 CPU 总比例
cum:当前函数加上它之上的调用运行总耗时
cum%:同上的 CPU 运行耗时总比例
最后一列为函数名称,在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,加以优化。

# 统计内存使用情况
go tool pprof http://localhost:6060/debug/pprof/heap

可视化界面

新加 data/d_test.go

package data

import "testing"

const url = "https://github.com/EDDYCJY"

func TestAdd(t *testing.T) {
    s := Add(url)
    if s == "" {
        t.Errorf("Test.Add error!")
    }
}

func BenchmarkAdd(b *testing.B) {
    for i := 0; i < b.N; i++ {
        Add(url)
    }
}

执行测试:

go test -bench=. -cpuprofile=cpu.prof
goos: linux
goarch: amd64
pkg: learn/data
cpu: 12th Gen Intel(R) Core(TM) i7-12700
BenchmarkAdd-20    	17487986	       100.0 ns/op
PASS
ok  	learn/data	2.007s

go tool pprof -http=0.0.0.0:8080 cpu.prof

提示

如果出现 Could not execute dot; may need to install graphviz.,就是提示你要安装 graphviz 了 (请右拐谷歌)

882e3173-4793-4aa6-bccb-5bfe5434283b

标签: go pprof 性能分析

不拘一格

职业:后端开发工程师
学校:重庆师范大学
城市:重庆
文章:165
一个喜欢学习的人,快来和我成为朋友吧....

登录逐梦笔记

注册逐梦笔记

已有账号?