【pprof】简要学习教程
基本介绍
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
使用为例)
- 编写 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】简要学习教程相关推荐
- Python简要学习教程
Python简要学习教程 1 Python基础性质 重点:Python是一种动态的强类型语言 接下来我们分开理解动态的和强类型: 1.1 动态 静态类型(static):所有的变量类型必须被显示地声明 ...
- MAYA 2022基础入门学习教程
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...
- Unity初学Shadergraph创建着色器学习教程
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:51节课(4h 44m) |大小解压后:2.55 G ...
- Git学习教程(一):git简介
转自:http://fsjoy.blog.51cto.com/318484/244397 第一课. git简介 内容:什么是git,为什么要使用git以及获取和学习git的途径. 欢迎来到github ...
- python一看就很厉害的代码_Python学习教程:怎么写出让人看起来就很舒服的代码?...
Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...
- 永磁同步电机矢量控制到无速度传感器控制学习教程(PMSM)(一)
一个阶段的学习结束了,整理了之前的过程中的学习成果,已经过了工作的年纪,在这里稍微出一下自己做的一套永磁同步电机的教程,从基础的矢量控制,到应用性较强的MTPA.弱磁控制等,最后深入到无速度传感器的控 ...
- 2023最新java学习教程(学习路线+课程大纲+视频教程+面试题+学习工具)
2023最新java学习教程汇总(学习路线+课程大纲+视频教程+面试题+学习工具) 目录 一.首先要了解什么是JAVA? 二.Java发展及就业前景分析 三.Java学习路线图 四.Java课程大纲 ...
- (转)Git学习教程(一):git简介
原文地址:http://fsjoy.blog.51cto.com/318484/244397 Git学习教程(一):git简介 2009-12-16 13:24:52 标签:git 学习 教程 [推 ...
- Vyond制作2D动画学习教程
Vyond为2D动画提供了极其简单的分解视频创建过程. 你会学到什么 课程获取:Vyond制作2D动画学习教程-云桥网 您将学习如何为2d动画制作画外音 您将学习如何使用Vyond轻松创建精彩的动画视 ...
最新文章
- STM32 usb 设备实现自动重枚举
- 【原创 深度学习与TensorFlow 动手实践系列 - 2】第二课:传统神经网络
- 爬楼梯 java_Leetcode 70.爬楼梯(Java)
- POJ培训计划2253_Frogger(最短/floyd)
- 移植sqlite3到arm-linux上(AM3352)
- idea开发SSM框架乐器租赁网站管理系统 (javaweb-php-asp.netC#-j2ee-springboot)
- 35年老程序员个人谈:C语言时代行将落幕
- 关于oracle的锁的级别以及介绍
- 【Turtle绘图系列】超火皮卡丘大全,可爱到爆炸~
- Week of 2.21
- 关于鬼谷子的数学推理题
- XX一中母亲写给高一禽兽儿子的信
- Ubuntu下重力方向调节
- 大学生开学必备物品清单男生2022 大学生开学必备物品男生
- 洛谷 P5108 仰望半月的夜空 解题报告
- vue element表格图片点击放大
- 读梁飞-RPC框架几行代码就够了 有感
- 用Python代码批量将ppt转换为pdf
- IoC 容器的两种实现
- sec 与csc的原函数
热门文章
Python简要学习教程 1 Python基础性质 重点:Python是一种动态的强类型语言 接下来我们分开理解动态的和强类型: 1.1 动态 静态类型(static):所有的变量类型必须被显示地声明 ...
流派:电子学习| MP4 |视频:h264,1280×720 |音频:AAC,48.0 KHz 语言:英语+中英文字幕(根据原英文字幕机译更准确)|大小解压后:3.41 GB |时长:4.5小时 包含 ...
MP4 |视频:h264,1280×720 |音频:AAC,44.1 KHz,2 Ch 语言:英语+中英文字幕(根据原英文字幕机译更准确) |时长:51节课(4h 44m) |大小解压后:2.55 G ...
转自:http://fsjoy.blog.51cto.com/318484/244397 第一课. git简介 内容:什么是git,为什么要使用git以及获取和学习git的途径. 欢迎来到github ...
Python学习教程:怎么写出让人看起来很优雅舒服的代码?让人眼前一亮! 很多新手在开始学一门新的语言的时候,往往会忽视一些不应该忽视的细节,比如变量命名和函数命名以及注释等一些内容的规范性,久而久之 ...
一个阶段的学习结束了,整理了之前的过程中的学习成果,已经过了工作的年纪,在这里稍微出一下自己做的一套永磁同步电机的教程,从基础的矢量控制,到应用性较强的MTPA.弱磁控制等,最后深入到无速度传感器的控 ...
2023最新java学习教程汇总(学习路线+课程大纲+视频教程+面试题+学习工具) 目录 一.首先要了解什么是JAVA? 二.Java发展及就业前景分析 三.Java学习路线图 四.Java课程大纲 ...
原文地址:http://fsjoy.blog.51cto.com/318484/244397 Git学习教程(一):git简介 2009-12-16 13:24:52 标签:git 学习 教程 [推 ...
Vyond为2D动画提供了极其简单的分解视频创建过程. 你会学到什么 课程获取:Vyond制作2D动画学习教程-云桥网 您将学习如何为2d动画制作画外音 您将学习如何使用Vyond轻松创建精彩的动画视 ...