基本介绍

pprof 是在做性能优化前的性能分析工具。

安装: go get -u github.com/google/pprof

分析工具

go tool pprof 是命令行指令,用于分析 Profiling 数据,源数据可以是 http 地址,也可以是已经 dump 下当 profile 文件;查看模式可以命令行交互模式,也可以是浏览器模式(-http 参数)。

两种应用

  • 服务型应用 _ "net/http/pprof" 包,专用于采集 web 服务 运行数据的分析。即在运行的服务中通过 API 调用取数据。
  • 工具型应用 "runtime/pprof" 包,专用于采集 应用程序 运行数据的分析。通过代码手动添加收集命令。

服务型应用场景中因为应用要一直提供服务。所以 pprof 是通过 API 访问来获取,pprof 使用了默认的 http.DefaultServeMux 挂在这些 API 接口。开发者也可以手动注册路由规则挂载 API,如 r.HandleFunc("/debug/pprof/debugopen", openFunc)

工具性应用是一个提供特定功能使用的工具,使用完就会退出进程的应用。开发者手动控制把 profile 文件保存到报告文件中。

封装了接口可以调用,如要进行 CPU Profiling,则调用 pprof.StartCPUProfile(w io.Writer) 写入到 w 中,停止时调用 StopCPUProfile();要获取内存数据,直接使用 pprof.WriteHeapProfile(w io.Writer) 函数则可。

可以做?

可以做( $host/debug/pprof/$type, $type 即下方列表的英文单词):

  • CPU 分析(profile): 你可以在 url 上用 seconds 参数指定抽样持续时间(默认 30s),你获取到概览文件后可以用 go tool pprof 命令调查这个概览
  • 内存分配(allocs): 所有内存分配的抽样
  • 阻塞(block): 堆栈跟踪导致阻塞的同步原语
  • 命令行调用(cmdline): 命令行调用的程序
  • goroutine: 当前 goroutine 的堆栈信息
  • 堆(heap): 当前活动对象内存分配的抽样,完全也可以指定 gc 参数在对堆取样前执行 GC
  • 互斥锁(mutex): 堆栈跟踪竞争状态互斥锁的持有者
  • 系统线程的创建(threadcreate): 堆栈跟踪系统新线程的创建
  • trace: 追踪当前程序的执行状况. 你可以用 seconds 参数指定抽样持续时间. 你获取到 trace 概览后可以用 go tool pprof 命令调查这个 trace

基本使用

(初学,以下暂时均以 net/http/pprof 使用为例)

  1. 编写 Demo 文件 demo.go,运行这个文件
package mainimport ("log""net/http"_ "net/http/pprof"
)func main() {go func() {for {log.Println(Add("Hello world"))}}()http.ListenAndServe("0.0.0.0:6060", nil)
}var datas []stringfunc Add(str string) string {data := []byte(str)sData := string(data)datas = append(datas, sData)return sData
}

通过 Web API 分析

  • 访问 http://localhost:6060/debug/pprof/ 页面,可以看到总览
  • 点击其中的链接,可以看到各部分的概览

注:网页点击一些链接会下载文件,这些文件应该是需要专用工具才能打开查看分析,如 profile;而且默认采样时长 30s

通过 dump 文件进行分析

通过 dump 文件进行分析可以在命令行中交互式分析,也可以通过浏览器进行可视化分析。

  • 通过执行命令 go tool pprof http://localhost:6060/debug/pprof/profile?seconds=60 会进行 60s 内进行采样(默认 30s),并进入 命令行交互模式

    $ go tool pprof http://localhost:6060/debug/pprof/profile
    Fetching profile over HTTP from http://localhost:6060/debug/pprof/profile
    Saved profile in C:\Users\xxxxxx\pprof\pprof.samples.cpu.003.pb.gz
    Type: cpu
    Time: Jun 17, 2020 at 3:25pm (CST)
    Duration: 30.14s, Total samples = 31.64s (104.96%)
    Entering interactive mode (type "help" for commands, "o" for options)
    (pprof)

可输入 help 查看可用命令,输入 o 查看可用选项。没多用这里就不再介绍。

CPU profile 的 top 命令

在 CPU profile 交互页面输入 topN 可以查看 top N 的概况(N 可省略,默认为 10)

(pprof) top
Showing nodes accounting for 29.92s, 94.56% of 31.64s total
Dropped 117 nodes (cum <= 0.16s)
Showing top 10 nodes out of 33flat  flat%   sum%        cum   cum%28.52s 90.14% 90.14%     28.58s 90.33%  runtime.cgocall0.81s  2.56% 92.70%      0.82s  2.59%  runtime.stdcall10.24s  0.76% 93.46%      0.25s  0.79%  runtime.stdcall30.16s  0.51% 93.96%     29.10s 91.97%  internal/poll.(*FD).writeConsole0.05s  0.16% 94.12%     29.28s 92.54%  internal/poll.(*FD).Write0.04s  0.13% 94.25%      0.18s  0.57%  runtime.findrunnable0.03s 0.095% 94.34%      0.18s  0.57%  runtime.mallocgc0.03s 0.095% 94.44%      0.25s  0.79%  runtime.mcall0.02s 0.063% 94.50%     29.49s 93.20%  log.(*Logger).Output0.02s 0.063% 94.56%     29.71s 93.90%  log.Println
(pprof)

信息:

  • 显示的节点在总共 31.64s 的抽样中,占 29.92s,比例 94.56%
  • 在 33 个样本中显示了 top 10
  • 列表解释(cum: cumulative 堆积的)
    • flat: 在给定函数上运行耗时
    • flat%: 在给定函数上运行耗时总比例
    • sum%: 给定函数 累计 使用 CPU 总比例
    • cum: 当前函数 以及包含子函数 的调用运行总耗时
    • cum%: 同上的 CPU 运行耗时总比例
    • 最后一列为函数名称

heap profile 的 top 命令

go tool pprof http://localhost:6060/debug/pprof/heap

$ go tool pprof http://localhost:6060/debug/pprof/heap
Fetching profile over HTTP from http://localhost:6060/debug/pprof/heap
Saved profile in C:\Users\xxxxxx\pprof\pprof.alloc_objects.alloc_space.inuse_objects.inuse_space.001.pb.gz
Type: inuse_space
Time: Jun 17, 2020 at 3:52pm (CST)
Entering interactive mode (type "help" for commands, "o" for options)
(pprof)
(pprof) top
Showing nodes accounting for 10.04GB, 100% of 10.04GB totalflat  flat%   sum%        cum   cum%10.04GB   100%   100%    10.04GB   100%  main.Add0     0%   100%    10.04GB   100%  main.main.func1
(pprof)
  • inuse_space: 常驻内存占用情况
  • alloc_objects: 内存临时分配情况

启用可视化界面进行分析

需要安装 graphviz,参考:Graphviz安装及简单使用。

  • 方式一: go tool pprof -http=:8080 cpu.prof,通过 -http 参数
  • 方式二: go tool pprof cpu.prof,然后在交互页面输入 web [funcName] 命令(函数调用图生成 svg 文件并用浏览器查看)

看懂这些菜单中的信息很重要,你可以知道中这个页面能做到什么,本人中调查过程中就没有注意这个问题,浪费了很多时间,到后面才后知后觉。

pprof菜单项

- VIEW 看各种视图- Top:主要看占用内存当排名信息- Graph:主要看调用关系图,并且通过框框的粗细、颜色当深浅、线的实虚、以及数字信息包括执行时间和占比- Flame Graph:火焰图,要看宽度和深度,heap 中宽度表明内存占用大小,- Peek- Source- Disassemble
- SAMPLE:采样信息,包括申请对象、申请空间、占用对象、占用空间的信息
- REFINE:可以精细化视图中的信息- Focus:聚焦在选中元素的上下游元素- Ignore:忽略选中当元素,包含其后继元素- Hide:隐藏选中当元素,但不会隐藏其后继元素- Show:只显示选中的元素,不包含后继元素- Show from:从选中当某一个元素开始,只列出其后继元素
- CONFIG:能将当前已精细化的页面保存起来

对比两个文件差异

可以使用 go tool pprof -http=:9092 -base 0713_1544_heap 0715_1439_heap 对比两个文件,并通过浏览器打开。很实用。

火焰图

【pprof】简要学习教程相关推荐

  1. Python简要学习教程

    Python简要学习教程 1 Python基础性质 重点:Python是一种动态的强类型语言 接下来我们分开理解动态的和强类型: 1.1 动态 静态类型(static):所有的变量类型必须被显示地声明 ...

  2. MAYA 2022基础入门学习教程

    流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...

  3. Unity初学Shadergraph创建着色器学习教程

    MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:51节课(4h 44m) |大小解压后:2.55 G ...

  4. Git学习教程(一):git简介

    转自:http://fsjoy.blog.51cto.com/318484/244397 第一课. git简介 内容:什么是git,为什么要使用git以及获取和学习git的途径. 欢迎来到github ...

  5. python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...

    Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...

  6. 永磁同步电机矢量控制到无速度传感器控制学习教程(PMSM)(一)

    一个阶段的学习结束了,整理了之前的过程中的学习成果,已经过了工作的年纪,在这里稍微出一下自己做的一套永磁同步电机的教程,从基础的矢量控制,到应用性较强的MTPA.弱磁控制等,最后深入到无速度传感器的控 ...

  7. 2023最新java学习教程(学习路线+课程大纲+视频教程+面试题+学习工具)

    2023最新java学习教程汇总(学习路线+课程大纲+视频教程+面试题+学习工具) 目录 一.首先要了解什么是JAVA? 二.Java发展及就业前景分析 三.Java学习路线图 四.Java课程大纲 ...

  8. (转)Git学习教程(一):git简介

    原文地址:http://fsjoy.blog.51cto.com/318484/244397  Git学习教程(一):git简介 2009-12-16 13:24:52 标签:git 学习 教程 [推 ...

  9. Vyond制作2D动画学习教程

    Vyond为2D动画提供了极其简单的分解视频创建过程. 你会学到什么 课程获取:Vyond制作2D动画学习教程-云桥网 您将学习如何为2d动画制作画外音 您将学习如何使用Vyond轻松创建精彩的动画视 ...

最新文章

  1. STM32 usb 设备实现自动重枚举
  2. 【原创 深度学习与TensorFlow 动手实践系列 - 2】第二课:传统神经网络
  3. 爬楼梯 java_Leetcode 70.爬楼梯(Java)
  4. POJ培训计划2253_Frogger(最短/floyd)
  5. 移植sqlite3到arm-linux上(AM3352)
  6. idea开发SSM框架乐器租赁网站管理系统 (javaweb-php-asp.netC#-j2ee-springboot)
  7. 35年老程序员个人谈:C语言时代行将落幕
  8. 关于oracle的锁的级别以及介绍
  9. 【Turtle绘图系列】超火皮卡丘大全,可爱到爆炸~
  10. Week of 2.21
  11. 关于鬼谷子的数学推理题
  12. XX一中母亲写给高一禽兽儿子的信
  13. Ubuntu下重力方向调节
  14. 大学生开学必备物品清单男生2022 大学生开学必备物品男生
  15. 洛谷 P5108 仰望半月的夜空 解题报告
  16. vue element表格图片点击放大
  17. 读梁飞-RPC框架几行代码就够了 有感
  18. 用Python代码批量将ppt转换为pdf
  19. IoC 容器的两种实现
  20. sec 与csc的原函数

热门文章

  1. 设计模式这扇窗之我见
  2. mysql主键和聚簇索引_MySQL 聚簇索引一定是主键吗
  3. 倒计时2天,和V神一起点燃这个夏天
  4. 报错Cause: java.sql.sQLException:请求的转换无效
  5. 使用C++快速计算网络抗毁性
  6. 【离线数仓-2-数据采集】
  7. 在Excel表格中如何快速拆分合并单元格
  8. opencv3_java 在已有的图像上画圆圈 CircleOnImg
  9. 笔记本黑屏只有鼠标是什么原因
  10. [ vulhub漏洞复现篇 ] vulhub 漏洞集合(含漏洞复现文章连接)