标签:profile 调用 http pprof 火焰 测试 go CPU
基本介绍
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 main
import (
"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 []string
func 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 33
flat flat% sum% cum cum%
28.52s 90.14% 90.14% 28.58s 90.33% runtime.cgocall
0.81s 2.56% 92.70% 0.82s 2.59% runtime.stdcall1
0.24s 0.76% 93.46% 0.25s 0.79% runtime.stdcall3
0.16s 0.51% 93.96% 29.10s 91.97% internal/poll.(*FD).writeConsole
0.05s 0.16% 94.12% 29.28s 92.54% internal/poll.(*FD).Write
0.04s 0.13% 94.25% 0.18s 0.57% runtime.findrunnable
0.03s 0.095% 94.34% 0.18s 0.57% runtime.mallocgc
0.03s 0.095% 94.44% 0.25s 0.79% runtime.mcall
0.02s 0.063% 94.50% 29.49s 93.20% log.(*Logger).Output
0.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 total
flat flat% sum% cum cum%
10.04GB 100% 100% 10.04GB 100% main.Add
0 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 文件并用浏览器查看)
看懂这些菜单中的信息很重要,你可以知道中这个页面能做到什么,本人中调查过程中就没有注意这个问题,浪费了很多时间,到后面才后知后觉。
![](http://upload-images.jianshu.io/upload_images/3491218-09cc6f3a6a5236f0.png?imageMogr2/auto-orient/strip|imageView2/2/w/564/format/webp)
- 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
对比两个文件,并通过浏览器打开。很实用。
火焰图
标签:profile,调用,http,pprof,火焰,测试,go,CPU 来源: https://www.cnblogs.com/jeffery-pan/p/15494741.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。