• 欢迎来到本博客,希望可以y一起学习与分享

go 性能剖析 PProf

笔记 benz 3周前 (08-29) 11次浏览 0个评论 扫描二维码
文章目录[隐藏]

PProf

想要进行性能优化,首先瞩目在 Go 自身提供的工具链来作为分析依据,本文将带你学习、使用 Go 后花园,涉及如下:

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

是什么

pprof 是用于可视化和分析性能分析数据的工具

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

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

支持什么使用模式

  • Report generation:报告生成
  • Interactive terminal use:交互式终端使用
  • Web interface:Web 界面

可以做什么

  • CPU Profiling:CPU 分析,按照一定的频率采集所监听的应用程序 CPU(含寄存器)的使用情况,可确定应用程序在主动消耗 CPU 周期时花费时间的位置
  • Memory Profiling:内存分析,在应用程序进行堆分配时记录堆栈跟踪,用于监视当前和历史内存使用情况,以及检查内存泄漏
  • Block Profiling:阻塞分析,记录 goroutine 阻塞等待同步(包括定时器通道)的位置
  • Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况

使用

Go语言内置了获取程序运行数据的工具,包括以下两个标准库:

  • runtime/pprof: 采集工具型应用运行数据进行分析
  • net/http/pprof: 采集服务型应用运行时数据进行分析

pprof开启后,每隔一段时间(10ms)就会收集当前的堆栈信息,获取各个函数占用的CPU以及内存资源,然后通过对这些采样数据进行分析,形成一个性能分析报告。

性能优化主要有一下几个方面:

  • CPU Profile:报告程序的CPU使用情况,按照一定频率去采集应用程序在CPU和寄存器上面的数据。
  • Memory Profile(Heap Profile):报告程序的内存使用情况。
  • Block Profiling: 报告goroutines不在运行状态的情况,可以用来分析和查找死锁等性能瓶颈。
  • Goroutine Profiling: 报告goroutines的使用情况,有哪些roroutines,它们的调用关系是怎样的。

注意:我们只应该在性能测试的时候才在代码中引入pprof

安装依赖

引用

分析

一、通过 Web 界面
查看当前总览:访问 http://127.0.0.1:6060/debug/pprof/

这个页面中有许多子页面,咱们继续深究下去,看看可以得到什么?

  • 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线程的堆栈跟踪

二、通过交互式终端使用
(1)go tool pprof http://localhost:6060/debug/pprof/profile\?seconds\=60

执行该命令后,需等待 60 秒(可调整 seconds 的值),pprof 会进行 CPU Profiling。结束后将默认进入 pprof 的交互式命令模式,可以对分析的结果进行查看或导出。具体可执行 pprof help 查看命令说明

  • flat:给定函数上运行耗时
  • flat%:同上的 CPU 运行耗时总比例
  • sum%:给定函数累积使用 CPU 总比例
  • cum:当前函数加上它之上的调用运行总耗时
  • cum%:同上的 CPU 运行耗时总比例

最后一列为函数名称,在大多数的情况下,我们可以通过这五列得出一个应用程序的运行情况,加以优化 。

(2)go tool pprof http://localhost:6060/debug/pprof/heap

  • -inuse_space:分析应用程序的常驻内存占用情况
  • -alloc_objects:分析应用程序的内存临时分配情况

Gin框架中使用pprof

Gin框架中使用pprof

先安装依赖包:

引入pprof

访问http://localhost:3000/debug/pprof, 通过这个页面我们可以看到我们需要的所有数据。

使用go tool pprof采集数据

上述命令的意思是采集协程数据并持续20S。执行结果如下:

现在已经进入了命令行模式,在最后一行的pprof后输入web,会自动打开本地浏览器并访问相关页面,当然这只限于图形化界面系统,如MacOS,Ubuntu Desktop,Windows等。

火焰图

收集数据
go tool pprof http://localhost:3000/debug/pprof/goroutine?second=20

分析数据
go tool pprof -http localhost:3001 C:\Users\benz\pprof\pprof.goroutine.004.pb.gz
localhost:3001:自定义打开的IP和Port。
C:\Users\benz\pprof\pprof.goroutine.004.pb.gz:是Saved profile in的值
访问:localhost:3001,选择View -> Flame Graph 即可看见火焰图。


文章 go 性能剖析 PProf 转载需要注明出处
喜欢 (0)

您必须 登录 才能发表评论!