一、Go导入pprof包的选择及go版本要求:

  • 如果你是使用 net/http 包来构建web服务(有启动http服务),想查看服务运行的相关状态,就可以使用 net/http/pprof 包,导入方式:"_ net/http/pprof",匿名引用是为了执行其 init() 函数,只要其 init() 函数被执行,pprof 就会自动持续地监控我们的程序了。基本不需要主动在程序中调用代码采集和输出性能分析结果。
  • 但如果只是一个普通的单机程序,就只能使用原生的 "runtime/pprof" 了,需要主动在程序中调用代码采集和输出性能分析结果
  • 如果你是使用 github.com/gin-gonic/gin 包来构建web服务,想查看服务运行的相关状态,就需要使用 github.com/gin-contrib/pprof 包。本文是使用gin框架来构建web服务的,因此导入的是 "github.com/gin-contrib/pprof" 包。具体gin框架构建web服务示例可参考:GO Gin框架的Post/Get请求示例
  • go version >= 1.1
  • 由源码可知,基于 http 的 pprof 是在你页面请求 profile 时,它会临时采集一个时间区间(比如30秒)内的对应性能数据,如下图;而访问其他指标会立即返回。所以在采集数据时需要先压测,这样才会有数据。

二、pprof查看web服务原始状态数据

浏览器访问:http://localhost:8000/debug/pprof/,结果如图:

注意:

  • 端口使用你自己web服务的监听端口号,例如我这里是:8000 端口
  • 采集前需要先压测,在压测过程中才会有数据被收集

三、go tool pprof 数据图形可视化

通过 pprof 得到的信息都是原始数据,阅读起来很费劲,我们可以通过 go tool pprof 命令来辅助查看以及将原始数据图形化的方式来展示。

  1. 下载安装可视化图形软件工具 graphviz :https://graphviz.org/download/。可自行选择Linux、Windows、Mac等对应版本,并且记得将该工具添加到系统环境变量中,否则会报错:failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in %PATH% 。我这里下载的是windows-64位的版本。

  2. 采集前需要先压测,在压测过程中才会有数据被收集:

  • go-wrk 是一个用Go语言实现的轻量级的http基准测试工具,先下载压测go工具:go get github.com/adjust/go-wrk
  • go-wrk -c=400 -t=8 -n=100000 http://127.0.0.1:8000/api/getReq。400个连接,8个线程, 模拟10w次请求。具体可参考:通过go-wrk进行HTTP接口压力测试。

注意:压测试,wrk的命令行参数只能发送类似于 get、delete 这种不在请求体body中带参数的http请求。如果要发送 post 这类请求,必须要写Lua脚本。 具体可参考:wrk入门(2):发送post请求

go-wrk 压测结果如下图所示:

  1. 压测的同时采集数据,并生成 profile 数据分析-结果文件:
  • cpu概要文件(在默认情况下,Go语言的运行时系统会以100 Hz的的频率对CPU使用情况进行取样):go tool pprof http://127.0.0.1:8000/debug/pprof/profile
  • 内存概要文件(保存在用户程序执行期间的堆内存使用情况):go tool pprof http://127.0.0.1:8000/debug/pprof/heap
  • 程序阻塞概要文件(保存用户程序中的Goroutine阻塞事件的记录):go tool pprof http://127.0.0.1:8000/debug/pprof/goroutine

    注意:
  • 由提示可知,它是先将下载的原始数据保存在临时文件,然后再进一步去分析。比如图中所示的 pprof.samples.cpu.001.pb.gz
  • 记住关键点:不管哪种方式收集,一定是在服务正在被压测或者业务逻辑正在执行的同时启动收集 \color{blue}{记住关键点:不管哪种方式收集,一定是在 服务正在被压测 或者 业务逻辑正在执行的同时 启动收集} 记住关键点:不管哪种方式收集,一定是在服务正在被压测或者业务逻辑正在执行的同时启动收集;刚开始不熟悉流程,可能在服务都没有任何请求的时候就去收集,这是毫无意义的,也不会收集到明显的 profile 信息,可能就会像下面这样,啥数据都看不到:
  1. 然后会进入一个交互界面,列表中各参数代表含义如下:

flat:当前函数占用CPU的时间
flat%:当前函数占用CPU百分比
sum%:当前所有函数累加使用 CPU 的比例
cum:当前函数以及子函数占用CPU的时间
cum%:当前函数以及子函数占用CPU的百分比

另外交互界面常用命令如下:

help:命令可以提供所有pprof支持的命令说明
top 10:列出前10
web:调用 graphviz 生成svg图片并打开
list:查看具体的函数分析
pdf:命令可以生成可视化的pdf文件
tree:以树状显示
png:以图片格式输出
svg:生成浏览器可以识别的svg文件

pprof具体定位代码段示例:
此处可以通过终端交互方式来定位具体耗时较长的代码段,如下:

  1. top5 -cum:按 “当前函数以及子函数占用CPU的时间” 倒序排列
  2. list MyWebService/internal/app/yunapi.Router.func1:根据具体调用函数名来查找对应代码段。可以看到下方的 “无效循环” 是导致此处执行耗时较长的根因,所以可以针对性的做优化,比如去除 “无效循环”

示例:当输入 web 后,会自动生成.svg文件,并在浏览器中显示可视化图形分析,如图所示:
流程图中有不同被调函数运行时长所占百分比,同时方框越大对应CPU耗时越久。不过只是这样仍然很难去分析,还有更直观的方式 ~

  1. 退出命令行,复制上面步骤3图中 Saved profile 后面的文件名及路径,比如:C:\Users\xxx\pprof\pprof.samples.cpu.001.pb.gz

  2. 输入以下 go tool pprof xxx 命令,会自动打开浏览器图形可视化页面,包含火焰图等…(其中 -http=:8081,或 -http localhost:8081 会启动一个http服务,端口为8081,然后浏览器会弹出此结果文件的图示页面)

  • linux下:
    go tool pprof -http=:8081 ~/pprof/pprof.samples.cpu.001.pb.gz
  • windows下路径用双反斜杠表示:
    go tool pprof -http localhost:8081 C:\\Users\\xxx\\pprof\\pprof.samples.cpu.001.pb.gz

Graph图示:

火焰图:
  每个方块代表一个函数,它下面一层表示这个函数会调用哪些函数,方块的大小代表了使用 CPU 所占百分比。火焰图的配色并没有特殊的意义,默认的红、黄配色是为了更像火焰而已。

  另外,有时候我们通过其他途径得到了 pprof 文件,也可以通过它来分析使用 go tool pprof 应用程序 应用程序的prof文件 或者 go tool pprof prof 文件

四、pprof使用方法总结:

  • 采集前需要先进行压测,在压测过程中再去收集才会有数据

    • go-wrk -c=400 -t=8 -n=100000 http://127.0.0.1:8000/api/getReq。400个连接,8个线程, 模拟10w次请求(get请求支持直接写命令行的形式,post请求需要借助lua脚本,较复杂)。
  • 压测的同时采集数据,并生成 profile 数据分析-结果文件:
    • go tool pprof http://127.0.0.1:8000/debug/pprof/profile
  • 此时会进入一个交互界面,且生成了一个类似于 pprof.samples.cpu.001.pb.gz 的待分析文件。具体性能结果分析方法,一共有两种:
    • 通过 终端交互 (此方法无需借助上述文件来分析):

      • top10 -cum 找到对应cpu/内存占用高的函数名称(-cum:按 “当前函数以及子函数占用CPU的时间” 倒序排列)
      • list xxx(xxx:top10 中最后一列列出的具体被调用函数的名称)
    • 通过 可视化图形分析 (此方法需借助上述文件来分析):
      • 退出 pprof 命令行,复制上面步骤3图中 Saved profile 后面的文件名及路径,比如:C:\Users\xxx\pprof\pprof.samples.cpu.001.pb.gz
      • 输入以下 go tool pprof xxx 命令,会自动打开浏览器图形可视化页面,包含火焰图等…
        1. linux下:go tool pprof -http=:8081 ~/pprof/pprof.samples.cpu.001.pb.gz
        2. windows下路径用双反斜杠表示:go tool pprof -http localhost:8081 C:\\Users\\xxx\\pprof\\pprof.samples.cpu.001.pb.gz
      • 注意:待分析的 .pb.gz 文件和 文件路径 是你自己电脑上对应的路径,这里仅仅是我测试的示例而已,可能会有所不同
  • go tool pprof github markdown参考文档

Go pprof 性能分析工具 - 详细使用图解相关推荐

  1. golang性能分析工具pprof介绍

    1 golang性能分析工具pprof介绍 文章目录 1 golang性能分析工具pprof介绍 1.1 pprof简介 1.2 pprof引入方法 1.3 使用pprof进行分析的方法 1.3.1 ...

  2. Mysql进阶优化篇01——四万字详解数据库性能分析工具(深入、全面、详细,收藏备用)

    前 言 ?? 作者简介:,长跑型选手,立志坚持写10年博客,专注于java后端 ?? 专栏简介:mysql进阶,主要讲解mysql数据库进阶知识,包括索引.数据库调优.分库分表等 ?? 文章简介:本文 ...

  3. Go性能分析工具pprof详解

    文章目录 一.什么是pprof 二.怎么使用pprof 1. 工具型应用 2. 服务型应用 三.`pprof`数据分析 CPU Profiling top指令排序展示 web指令生成图示 list指令 ...

  4. C++ 性能分析工具调研

    文章目录 0. 前言 1. gprof 3. valgrind 4. gperftools 5. perf 0. 前言 目标:性能分析(profile)包含的内容特别多,但目前我只关注运行时间. 详细 ...

  5. 正确使用 Android 性能分析工具——TraceView

    前面唠叨 最近公司app中有些列表在滑动的时候会有卡顿现象,我就开始着手解决这些问题,解决问题之前首先要分析列表滑动的性能瓶颈在什么地方.因为之前不会正确使用TraceView这个工具,主要是看不懂T ...

  6. 系统级性能分析工具perf的介绍与使用

    测试环境:Ubuntu16.04 + Kernel:4.4.0-31 apt-get install linux-source cd /usr/src/tools/perf make &&am ...

  7. 性能之巅:Linux网络性能分析工具-netstat,ifconfig,nicstat,traceroute,tcpdump

    原文地址:http://www.infoq.com/cn/articles/linux-networking-performance-analytics 本文介绍基于Linux操作系统的网络性能分析工 ...

  8. 系统级性能分析工具 — Perf

    从2.6.31内核开始,linux内核自带了一个性能分析工具perf,能够进行函数级与指令级的热点查找. perf Performance analysis tools for Linux. Perf ...

  9. 前端性能分析工具利器

    作者:basinwang,腾讯 PCG 前端开发工程师 大型项目容易遇到性能问题,一般来说,当我们遇到性能瓶颈的时候,才会开始去进行相应的分析.分析的方向除了业务本身的特点相关之外,常见的还可以借助一 ...

最新文章

  1. MySQL 高级 - 存储过程 - 语法 - loop循环
  2. trigger自动执行事件
  3. CentOS7中多台服务器配置时钟同步
  4. EF中 GroupJoin 与 Join
  5. 【撸码师备忘录】腾讯API接入列表
  6. 什么是U-Boot以及如何下载U-Boot源码
  7. Cloud一分钟 | 云厂商Zoho域名被禁两小时;京东云公布医疗健康战略
  8. python gif 透明,Python3+试点批量处理简单的GIF到PNG并透明地去除背景色,python3Pillow,gif,转成,png,透明化,去掉...
  9. php json decode 遍历,php json_decode 解析中文
  10. TikZ绘图示例——尺规作图: 圆内接正七边形的近似画法
  11. AI-多云互联,网络通信的“自动驾驶
  12. 301与302页面重定向
  13. 当第一资本、高盛、摩根士丹利等巨头纷纷启用CDO时,您想到了什么?
  14. 定制通达信多周期同列版面
  15. 谷歌浏览器任务栏图标变白色解决方法
  16. Unity Resource Manager
  17. AntV X6流程图绘制程序(官方示例纯javascript+html+css)
  18. Linux ACLs
  19. CGB2109-Day12-用户模块管理
  20. SIMD——MMX指令集介绍

热门文章

  1. 可以运行在微信小程序上的编程语言
  2. mysql reorg 命令_DB2 runstats、reorgchk、reorg 命令
  3. Matplotlib官方文档学习笔记 PART1-简介 C2-pyplot教程 (19-12-4 by-xieyuxin)
  4. Linux文件管理初探---学习文件管理,我想你必须要知道的目录
  5. 中金财富后台开发一面经验分享
  6. 解决:Parameter 0 of constructor in xxx required a bean of type ‘xxx‘ that could not be found.
  7. DenseNet模型解读
  8. Mac苹果电脑上有哪些好用的txt小说阅读器?
  9. Data + AI Summit 2022 超清视频下载
  10. 2022初级会计实务教材读书笔记