这是我参与「第五届青训营 」伴学笔记创作活动的第 5 天
说明
- 希望知道应用在什么地方耗费了多少 CPU、Memorypprof 是用于可视化和分析性能分析数据的工具
搭建 pprof 实践项目
-
GitHub (来自 Wolfogre ) github.com/wolfogre/go…
-
项目提前埋入了一些炸弹代码,产生可观测的性能问题
-
allocs:内存分配情况
-
blocks:阻塞操作情况
-
cmdline:程序启动命令及
-
goroutine:当前所有goroutine的堆栈信息
-
heap:堆上内存使用情况(同alloc)
-
mutex:锁竞争操作情况
-
profile: CPU占用情况
-
threadcreate:当前所有创建的系统线程的堆栈信息
-
trace:程序运行跟踪信息
CPU
-
命令: topN
-
查看占用资源最多的函数
-
Flat == Cum,函数中没有调用其他函数
-
Flat == 0,函数中只有其他函数的调用
命令: list
- 根据指定的正则表达式查找代码行
命令: web
- 调用关系可视化
Heap-堆内存
-
go tool pprof -http=:8080'http://localhost:6060/debug/pprof/heap
-
alloc objects: 程序累计申请的对象数
-
alloc space: 程序累计申请的内存大小
-
inuse objects: 程序当前持有的对象数
-
inuse space: 程序当前占用的内存大小
goroutine-协程
- goroutine泄露也会导致内存泄露
goroutine-协程
-
go tool pprof -http=:8080http://localhost:6060/debug/pprof/goroutine
-
由上到下表示调用顺序
-
每一块代表一个函数,越长代表占用 CPU 的时间更长
-
火焰图是动态的,支持点击块进行分析
-
支持搜索,在 Source 视图下搜索 wolf
mutex-锁
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/mutex
block-阻塞
- go tool pprof -http=:8080 "http://localhost:6060/debug/pprof/block
性能分析工具 pprof-采样过程和原理
CPU
- 采样对象: 函数调用和它们占用的时间
- 采样率: 100次/秒,固定值
- 采样时间: 从手动启动到手动结束
操作系统
- 每10ms向进程发送一次SIGPROF信号
进程
每次接收到SIGPROF会记录调用堆栈
写缓冲
每100ms读取已经记录的调用栈并写入输出流
Heap-堆内存
- 采样程序通过内存分配器在堆上分配和释放的内存,记录分配/释放的大小和数量
- 采样率:每分配512KB记录一次,可在运行开头修改,1为每次分配均记录
- 采样时间:从程序运行开始到采样时
- 采样指标: alloc space,alloc objects,inuse _space,inuse_objects
- 计算方式: inuse = alloc - free