性能分析工具pprof学习小记| 青训营笔记

124 阅读3分钟

仅仅记录概念性信息以及可能用到的操作,并未涉及根据pprof生成的报告进行分析的内容。

介绍

pprof是Go程序的性能分析工具,提供了分析和可视化Go程序性能的方法。它可用于分析CPU使用率、内存使用率和阻塞事件,并能生成详细报告,以帮助识别程序中的性能瓶颈。

image.png

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

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

Block Profilling:阻塞分析,记录Goroutine阻塞等待同步(包括定时器通道)的位置,默认不开启,需要调用 runtime.SetBlockProfileRate 进行设置。

Mutex Profiling:互斥锁分析,报告互斥锁的竞争情况,默认不开启,需要调用 runtime.SetMutexProfileFraction 进行设置。

Goroutine Profiling:Goroutine 分析,通过对当前程序正在运行的 Goroutine 进行堆栈跟踪和分析来提高程序性能的技术.很多问题出现时的表象就是 Goroutine 暴增,而这时候我们要做的事情之一就是查看程序中的 Goroutine 正在做什么事情,因为什么阻塞了。

使用

首先,在代码中添加 _ "net/http/pprof" 的引用

// 限制 CPU 使用数,避免过载,可加可不加
runtime.GOMAXPROCS(1)
// 如果未来希望进行互斥锁的采集,
// 那么需要通过调用该方法来设置采集频率
// 若不设置或没有设置大于 0 的数值,默认是不进行采集的
runtime.SetMutexProfileFraction(1)
// 开启对阻塞操作的跟踪
runtime.SetBlockProfileRate(1)

运行起程序后

可通过浏览器访问,http://localhost:6060/debug/pprof/ 得知程序总览页面

image.png

类型解释
allocs查看过去所有内存分配的样本,访问路径为 $HOST/debug/pprof/allocs。
block查看导致阻塞同步的堆栈跟踪,访问路径为 $HOST/debug/pprof/block。
cmdline当前程序的命令行的完整调用路径。
goroutine查看当前所有运行的 goroutines 堆栈跟踪,访问路径为 $HOST/debug/pprof/goroutine。
heap查看活动对象的内存分配情况, 访问路径为 $HOST/debug/pprof/heap。
mutex查看导致互斥锁的竞争持有者的堆栈跟踪,访问路径为 $HOST/debug/pprof/mutex。
profile默认进行 30s 的 CPU Profiling,得到一个分析用的profile 文件,访问路径为 $HOST/debug/pprof/profile。
threadcreate查看创建新 OS 线程的堆栈跟踪,访问路径为 $HOST/debug/pprof/threadcreate。

由于直接阅读采样信息缺乏直观性,我们往往需要借助 go tool pprof 命令来排查问题,这个命令是 go 原生自带的,所以不用额外安装。

直接点进去,是直接下载对于的profile文件

如果机会在浏览器中查看,需要在路径名后加上debug=1

image.png go tool pprof 命令是用于分析 Go 程序性能的工具。它可用于生成并分析 CPU 使用情况、内存使用情况和阻塞事件等的性能概要。

基本用法:

go tool pprof [options] URL

URL为pprof浏览器查看中,对应的 http://localhost:6060/debug/pprof/profilehttp://localhost:6060/debug/pprof/mutex等等

go tool pprof从该接口获得程序信息,然后通过命令行交互对该信息进行查看

其中options中常用的:

  • -http参数:添加-http=:6001,将在所指定的端口号运行一个 pprof 的分析用的站点
  • -seconds: 指定 profile 的持续时间。
  • -inuse_space:分析应用程序的常驻内存占用情况。
  • -alloc_objects:分析应用程序的内存临时分配情况。

go tool pprof 命令还提供了许多子命令,可用于进一步分析和可视化分析数据。常用的一些子命令包括:

  • web : 用交互式浏览器打开分析数据
  • top : 显示使用最多资源的函数
  • list : 显示分析中函数的源代码
  • svg : 生成调用图的 SVG 可视化
  • traces : 打印出对应的所有调用栈,以及指标信息

top命令的输出报告:

(pprof) top10
Showing nodes accounting for 36.23s, 97.26% of 37.25s total
Dropped 80 nodes (cum <= 0.19s)
Showing top 10 nodes out of 34
      flat  flat%   sum%        cum   cum%  Name
    32.63s 87.60% 87.60%     32.70s 87.79%  syscall.syscall
     0.87s  2.34% 89.93%      0.88s  2.36%  runtime.stringtoslicebyte
     0.69s  1.85% 91.79%      0.69s  1.85%  runtime.memmove
     0.52s  1.40% 93.18%      0.52s  1.40%  runtime.nanotime
     ...
(pprof) 
  • flat:函数自身的运行耗时。
  • flat%:函数自身在 CPU 运行耗时总比例。
  • sum%:函数自身累积使用 CPU 总比例。
  • cum:函数自身及其调用函数的运行总耗时。
  • cum%:函数自身及其调用函数的运行耗时总比例。
  • Name:函数名

可视化查看

前置条件:安装 graphviz 组件

推荐使用: 此命令将在所指定的端口号运行一个 PProf 的分析用的站点。

$ go tool pprof -http=:6001 profile 

访问http://localhost:6001/ui/

进入以下界面

image.png

常用可视化图为:Graph,Flame Graph

Graph视图是pprof工具中用来展示整体函数调用流程的视图。

在这个视图中,每个函数被表示为一个框,每个函数的调用关系被表示为从调用者指向被调用者的线。 框越大、线越粗、框颜色越鲜艳(红色)就代表该函数占用的时间越久,开销越大。相反,若框颜色越淡、越小,则代表该函数在整体函数调用流程中开销相对较小。

image.png 火焰图是一种特殊的性能分析工具,它通过将函数堆栈的调用关系可视化,帮助我们快速发现程序中的性能瓶颈。

与Graph视图不同的是,火焰图更侧重于展示函数之间的相对关系,而不是绝对关系,并且火焰图中的函数调用关系是从上往下展示的。

在火焰图中,函数的宽度代表了该函数在程序中所占用的时间/资源的比例,同时颜色也可以帮助我们分辨出不同的函数。

image.png